位運算符
<code>&</code> :與
<code>|</code> :或
<code>^</code> :異或
<code>~</code> :非(取反)
<code>>></code> <code><<</code> :右移(補符号位),左移(補0)
<code>>>></code> :右移(0補充高位)
對于int型,1<<35與1<<3是相同的,而左邊的操作數是long型時需要對右側操作數模64

異或:
可以了解為不進位加法:1+1=0,0+0=0,1+0=1
性質:
1、交換律:a ^ b = b ^ a
2、結合律:(a ^ b) ^ c = a ^ (b ^ c)
3、對于任何數x,都有x ^ x = 0,x ^ 0 = x
4、自反性:a ^ b ^ b = a ^ 0 = a,連續和同一個因子做異或運算,最終結果為自己
應用
<code>x & 1 = 1</code> x是奇數
<code>x & 1 = 0</code> x是偶數
核心是判斷二進制數最後一位是1還是0
使用前提:a,b不相等
<code>(num^(num>>31))+(num>>>31)</code>
11111111 11111111 11111111 11110111:num
11111111 11111111 11111111 11111111:num>>31
00000000 00000000 00000000 00001000:num^(num>>31)
00000000 00000000 00000000 00000001:num>>>31
00000000 00000000 00000000 00001001:num^(num>>31))+(num>>>31
正數顯然滿足
負數的相反數是原碼含符号位取反加一
<code>x&(x-1)</code> :可以使二進制數x的最低位的1變成0;
例題
1-1000這1000個數放在含有1001個元素的數組中,隻有唯一的一個元素值重複,其它均隻出現一次。每個數組元素隻能通路一次,設計一個算法,将它找出來;不用輔助存儲空間,能否設計一個算法實作?
核心:<code>x^x=0</code>
可以強行配湊消去其他元素:這1001個元素連續異或,再異或上1-1000這1000個數。
其他元素都出現2次,異或後變成0.而唯一的一個元素值出現3次,連續異或後值不變。
一個數組裡除了某一個數字之外,其他的數字都出現了兩次。請寫程式找出這個隻出現一次的數字。
請實作一個函數,輸入一個整數,輸出該整數二進制表示中1的個數。
例:9的二進制表示為1001,有2位是1
法一:
該二進制數不斷無符号右移并與1做與運算,結果為1則count++,直到該數變為0
法二:
每次使該二進制數的一個為1的二進制位變成0,count++,直到該數變成0;
<code>x&(x-1)</code> :可以使二進制數的最低位的1變成0;
用一條語句判斷一個整數是不是2的整數次方
也就是一個整數的二進制形式中為1的二進制位是不是隻有一個。聯系上一題,也就是count是不是為1
先取出偶數位和奇數位,偶數結果右移一位,奇數結果左移一位,最後異或
abababab abababab abababab abababab
a0a0a0a0 a0a0a0a0 a0a0a0a0 a0a0a0a0(ou)
0b0b0b0b 0b0b0b0b 0b0b0b0b 0b0b0b0b(ji)
0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a(ou>>>1)
b0b0b0b0 b0b0b0b0 b0b0b0b0 b0b0b0b0(ji<<1)
babababa babababa babababa babababa
給定一個介于0和1之間的實數,(如0.625),類型為double,列印它的二進制表示(0.101,因為小數點後的二進制分别表示0.5,0.25.0.125......) 。
如果該數字無法精确地用32位以内的二進制表示,則列印“ERROR”
數組中隻有一個數出現了1次,其他的數都出現了k次,請輸出隻出現了1次的數。
2個相同的2進制數做不進位加法,結果為0
10個相同的10進制數做不進位加法,結果為O
k個相同的k進制數做不進位加法,結果為0