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...