今天做到關於位運算的演算法題的時候發現自己好像是一點也不是很了解。於是就開始找了有關位運算的題目開始補。
#第一題:
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示
首先要了解以下的基本的位操作符:
符號含義描述
運算規則&與
兩個位都為1時,結果才為1i或
兩個位都為0時,結果才為0^異或
兩個位相同為0,相異為1~取反
0變1,1變0
<<
左移各二進位全部左移若干位,高位丟棄,低位補0
>>
右移各二進位全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位(算術右移),有的補0(邏輯右移)
##分析:
這是牛客上的一道題目,假設
5 = 0000 0101
我們可以迴圈做移位運算5<<1後,與1做與運算,若等於1則count++。這樣做確實是可以暫時得到我們想要的答案。
public static int numberof1_cannotuse(int n)
n = n >> 1;
} return count;
}
但是我們我們的無符號整數時包括負數的,負數用補碼表示,假設n=-5時,其補碼為-5=1111 1011,當-5>>1時,補碼向右移的時候高位加1,這會導致我們的count++至+∞導致死迴圈。
所以我們應該換一下時目標數字往左移。即-5<<1,這樣就會很好的解決了我們的問題,因為不管是正數還是負數<<1的時候都是在末位加0.
private static int numberof1_low(int n)
flag = flag << 1;
}return count;
}
####最優解:
public static int numberof1(int n)
return count;
}
#第二題:
給定乙個整數,編寫乙個函式來判斷它是否是 2 的冪次方。
##分析:
觀察二次冪:
2=14=10
8=100
16=1000
32=10000
…可以很容易的看出來二次冪的規律,只有在其高位有1,其餘都是為0。所以我們只需要將數字向右移即可
public boolean numberof1(int n)
return cnt == 1;
}
但是後來看到了更加簡單的例子,emmm大佬還是很多的啊!我等渣渣還是得好好努力。
public boolean numberof1(int n)
#第三題:
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
##分析:
將所有元素做異或運算,即a[1] ^ a[2] ^ a[3] ^ …^ a[n],所得的結果就是那個只出現一次的數字
public int numberof1(int m)
return result;
}
位反轉演算法
比如0x12 0001 0010 反轉後變成 0100 1000 即0x48 static unsigned char buf 0x12,buf1 0 static int m,n for m 7,n 0 m n 0 m n buf buf1 將兩位元組short型別數高低位元組取出來 unsign...
演算法 位運算
public static intpowern int m,int n return m public static void main string args public static boolean ispower int n return false num如何使2的n次冪,那麼num nu...
位排序演算法
位排序演算法,一種占用記憶體小 執行時間快應用於特殊情況的演算法 0x01.問題背景 0x02.解決方法 1.歸併排序 磁碟檔案最常用的排序演算法就是歸併排序,但是對於千萬數量級別的資料,執行時間是以天為單位 歸併排序演算法實現 int mergesortcore int array,int lo,...