應用:1.判斷奇偶 2.見後面有趣應用
本身異或為0,與0異或為本身,滿足交換律。
應用:不借助第三個數交換兩數,有趣應用4
[cpp]view plain
copy
void
swap(
int&a,
int&b)
} 可以這樣理解:
第一步 a^=b 即a=(a^b);
第二步 b^=a 即b=b^(a^b),由於^運算滿足交換律,b^(a^b)=b^b^a。由於乙個數和自己異或的結果為0並且任何數與0異或都會不變的,所以此時b被賦上了a的值。
第三步 a^=b 就是a=a^b,由於前面二步可知a=(a^b),b=a,所以a=a^b即a=(a^b)^a。故a會被賦上b的值。
應用:求相反數
應用:有趣應用2,3
給出乙個16位的無符號整數。稱這個二進位制數的前8位為「高位」,後8位為「低位」。現在寫一程式將它的高低位交換。例如,數34520用二進位制表示為:
10000110
11011000
將它的高低位進行交換,我們得到了乙個新的二進位制數:
11011000
10000110
[cpp]view plain
copy
#include
/*輸出二進位制位,每8位輸出乙個空格*/
void
printbits(unsigned
short
a)
putchar('\n'
);
} int
main(
void
)
類似於並歸
的分組處理
假設左右兩邊已經倒好了序(圖2),只需要交換左右兩邊就能倒好序,按這樣思考下去。。。。,直到小組內只有1個數時(圖3)。
要點一:整體思想,乙個顏色的當乙個整體,那麼倒數第一步和第一步實際上就是一樣的,只是第一步分成了4組在進行。
下圖只畫了8位,不是16位,理解了原理就對了。
按左圖到右圖思考,
從右往左編寫**。
//二進位制逆序
#include
void
printfbinary(unsigned
short
a)
putchar('\n'
);
}
intmain()
還是分組處理,思路是:用最後4位的數值就是1的個數
下圖任然是只有8位,理解思路重要
以34520為例,可以通過下面四步來計算其二進位制中1的個數二進位制中1的個數。
()第一步:每2位為一組,組內高低位相加
10 00 01 10 11 01 10 00
-->01 00 01 01 10 01 01 00 (二進位制看不慣的話,看上圖)
第二步:每4位為一組,組內高低位相加
0100 0101 1001 0100 //1+0=1 1+1=2 2+1=3 1+0=1
-->0001 0010 0011 0001
第三步:每8位為一組,組內高低位相加
00010010 00110001 //1+2=3 4+1=4
-->00000011 00000100 (從這裡開始,組內除了後4位,其餘的全肯定為0,1的個數最多16個,4位數儲存結果夠了)
第四步:每16位為一組,組內高低位相加
00000011 00000100 //3+4=7
-->00000000 00000111
這樣最後得到的00000000 00000111即7即34520二進位制中1的個數。
[cpp]view plain
copy
#include
/*輸出二進位制位,每8位輸出乙個空格*/
void
printbits(
inta)
putchar('\n'
);
} int
bits(
intx)
intmain(
void
)
[cpp]view plain
copy
#include
#define n 9
intmain(
void
) ;
intx=0;
for(i=0;i
printf("只重複一次的數是:%d\n"
,x);
}
有趣的位運算
今天看到知乎裡面看到兩個有趣的位運算,記錄一下 第乙個是判斷乙個數的奇 偶性 奇數返回 true boolean isodd int n 就我個人的理解說一下吧,按照二進位制轉換成十進位制的一種方式,最後的一位是 1 2的0次方或者是0 2的0次方。這個是int數末尾為1的時候就是奇數咯,為0的時候...
有趣的位運算
看了會 c程式語言 的位運算一節,重溫了下 位運算 的巧妙與高效。與操作可以用來判斷乙個整數的奇偶性,依據二進位制的性質可以很容易得到這樣的結論,因此 if a 1 a is odd else a is even 左移右移的應用應該更熟悉,可以方便進行 2和 2操作。之前遇到的應用有快速冪之類的。學...
c語言位運算
c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0 按位或 兩個相應的二進位制位中只要有乙個為1,該位的結果值為1 按位異或 若參加運算的兩個二進位制位值相同則為0,否則為1 取反 是一元運算子,用來對乙個二進位制數按位取反,即將0變1...