c語言有趣的位運算

2021-07-07 05:16:47 字數 2699 閱讀 4087

應用: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...