6種常用位操作符的原理及其用途

2021-06-27 21:25:05 字數 3320 閱讀 3186

c語言位操作符的原理及其用途

6種位操作符的形式與含義如下:

&:按位「與」(and);

|:按位「或」(or);

^:按位「異或」(xor);

~:「取反」(not);

>>:資料右移;

<<:資料左移;

(以下內容摘自網路並整理)

一、按位「與」運算

原理:按位「與」運算子&的作用是對運算子兩側以二進位制表達的運算元按位分別進行「與」運算,而這一運算是以數中相同的位(bit)為單位的。操作的規則是:僅當兩個運算元都為1時,輸出的結果才為1,否則為0。例如:

a=0x88,b=0x81,則a&b的運算結果如下:

0x88  10001000  a數 &

0x81  10000001  b數

=10000000

其中,&運算子讓a數0x88與b數0x81的1位與1位、2位與2位……7位與7位分別相「與」。由於「與」運算的操作規則是,兩個運算元中各位只要有1個為0,其結果中對應的位就為0。而a數與b數中只有最高位(第7位)均為1,因而該位結果為1,其它各位結果都為0。

用途:通常我們可把按位「與」操作&作為關閉某位(即將該位置0)的手段,例如我們想要關閉a數中的第3位,而又不影響其它位的現狀,可以用乙個數0xf7,即二進位制數11110111去與a數作按位「與」運算:

0x88  10001000  a數 &

0xf7  11110111  遮蔽數

=10000000

注意,這個數除第3位為0外,其它各位均為1,操作的結果只會將a數中的第3位置0,而a數的其它位不受影響。也就是說,若需要某個數的第n位關閉,只需要將該數與另乙個數按位相與,另乙個數除了相應的第n位為0外,其它各位都為1,以起到對其它各位的遮蔽作用。

上面的運算可以用a=a&(0xf7)來表示,也可以用a&=(0xf7)來表達。這兩個表示式功能是相同的,但在源程式**中常常見到的以第二種形式為多。

二、按位「或」運算

原理:按位「或」運算子|的作用是對運算子兩側以二進位制表達的運算元按位分別進行「或」運算,而這一運算是以數中相同的位(bit)為單位的。操作的規則是:僅當兩個運算元都為0時,輸出的結果才為0,否則為1。例如:

a=0x88,b=0x81,則a|b的運算結果如下:

0x88  10001000  a數 |

0x81  10000001  b數

=10001001

用途:通常我們可把按位「與」操作|作為置位(即將該位置1)的手段,例如我們想要將a數中的第0位和1位置1,而又不影響其它位的現狀,可以用乙個數0x03,即二進位制數00000011去與a數作按位「或」運算:

0x88  10001000  a數 |

0x03  00000011  置位數

=10001011

注意,這個數除第0、1位為1外,其它各位均為0,操作的結果只會將a數中的第0、1位置0,而a數的其它位不受影響。也就是說,若需要某個數的第n位置1,只需要將該數與另乙個數按位相「或」,另乙個數除了相應的第n位為1外,其它各位都為0,以起到對其它各位的遮蔽作用。上面的運算可以用a=a|(0xf7)來表示,也可以用a|=(0xf7)來表達。

三、按位「異或」運算

按位「異或」運算子^的作用是對運算子兩側以二進位制表達的運算元按位分別進行「異或」運算,而這一運算是以數中相同的位(bit)為單位的。異或運算操作的規則是:僅當兩個運算元不同時,相應的輸出結果才為1,否則為0。例如:

a=0x88,b=0x81,則a^b的運算結果如下:

0x88  10001000  a數 ^

0x81  10000001  異或數

=00001001

用途:(1)按位「異或」運算可以使特定的位取反

例如:我們想讓a數中的最低位和最高位取反,只要用0x81,即二進位制數10000001去與它作按位「異或」運算,其運算結果同上式。經過操作後,最高位的值已經由1變0,而最低位的值也已經由0變1,起到了使這兩位翻轉的效果。其它位的狀態保持不變。

可以看到,這個數除最低位、最高位為1外,其它各位均為0,操作的結果只會將a數中的第0、7位取反,而a數的其它位不受影響。也就是說,若需要某個數的第n位取反,只需要將該數與另乙個數按位相「異或」,另乙個數除了相應的第n位為1外,其它各位都為0,以起到對其它各位的遮蔽作用。上面的運算可以用a=a^(0x81)來表示,也可以用a^=(0x81)來表達。

a^=b

b^=a

a^=b

首先,a^=b:

a 00000011 ^

b 00000100  

a=00000111

其次,b^=a:

b 00000100 ^

a 00000111  

b=00000011

最後,a^=b:

a 00000111 ^

b 00000011  

a=00000100

這樣,a、b兩個變數中的值就進行了對調。(此操作比用臨時變數的方式高效很多)

四、「取反」運算

「取反」運算子~的作用是將各位數字取反:所有的0置為1,1置為0。

例如:10010110取反後為01101001。

五、資料右移

資料右移操作符》將變數的各位按要求向右移動若干位。右移語句的通常形式是:variable>>右移位數。 如:

a=11110000;

進行a=a>>2操作後,a=00111100。

六、資料左移

資料左移操作符《將變數的各位按要求向左移動若干位。左移語句的通常形式是:variable《左移位數 如:

a=11110000;

進行a=a<<2操作後,a=11000000。

注意:無論是左移還是右移,當某位從一端移出時,另一端出現的空白將以從外面移入的0(某些計算機是送1)來補充。這說明,移位不同於迴圈,從一端移出的位並不送回到另一端去,移去的位永遠丟失了,同時在另一端只能補上相應位數的0。

用途:移位操作可用於整數的快速乘除運算,左移一位等效於乘2,而右移一位等效於除以2。

如:x=7,二進位制表達為:00000111,

x<<1    00001110,相當於:x=2*7=14,

x<<3    01110000,相當於:x=14*2*2*2=112

x<<2    11000000,x=192

在作第三次左移時,其中一位為1的位移到外面去了,而左邊只能以0補齊,因而便不等於112*2*2=448,而是等於192了。當x按剛才的步驟反向移動回去時,就不能返回到原來的值了,因為左邊丟掉的乙個1,再也不能找回來了。

右移做除法,如:

x>>2    00110000    x=48

x>>3    00000110    x=48/8=6

x>>1    00000011    x=6/2=3

2 1 常用位操作符

預備知識 什麼是位?還記得吧,乙個位元組是八位,所謂的一位就是乙個二進位制位,也就是說每一位可以存放乙個二進位制數0或1。1.位與 1 位與符號是 按照乙個數的二進位制位按位與。2 位與的真值表 1 1 1,1 0 0,0 1 0,0 0 0.好,那我們來舉個例子 兩個二進位制數分別是 101010...

神奇的位操作符

相信學過c語言的小夥伴們都知道位操作符,正確的使用位操作符會讓我們寫出更高效率的程式 但不要忘記它也是有缺點的 只能用於整型和字元型資料。速度 快於乘法 等同於加減法 參與運算的資料以補碼形式出現!不要弄錯啦!eg 數字 1 原碼 10000000 00000000 00000000 0000000...

js的位操作符

操作符 用法描述 按位與 a b 如果兩個運算元對應位都是 1 的話則在該位返回 1。按位或 a b 如果兩個運算元對應位都是 0 的話則在該位返回 0。按位異或 a b 如果兩個運算元對應位只有乙個 1 的話則在該位返回 1。求反 a 反轉運算元的每一位。左移a b 將 a 的二進位制形式左移 b...