1、按位操作符
1.1 按位「與」&(雙目運算子):
僅當兩個運算元都為1時,結果為1,否則為0。參與運算的數以補碼方式出現。
例:9&5=1
0000 1001------------- 9的補碼
& 0000 0101------------- 5的補碼
----------
0000 0001------------- 1的補碼
應用:a、通常將某些位清零或保留某些位。
例如:將a的高八位清零,保留低八位,可做a&255運算。
00000000 11111111—————— 255的二進位制數
00000000 00100000—————— a的二進位制數
------------------
00000000 11111111
b、取某數的指定位。例如:設a=1000 1110,要取出a中第二位的1,則可以用
a & 0000 0010 實現。
1.2 按位「或」|(雙目運算子):
僅當兩個運算元都為0時,結果為0,否則為1。
例:9|5=13
0000 1001------------- 9的補碼
| 0000 0101------------- 5的補碼
----------
0000 1101------------- 13的補碼
應用:常用來將源運算元某些位置1。例如:設a=0100 0001,將低四位全部置1,則可以用 a | 0000 1111 實現。
1.3 按位「異或」^(雙目運算子):參加運算的兩數各對應的二進位相異或,當對應的二進位相異時,結果為1.
例: 9^5=12
0000 1001------------- 9的補碼
^ 0000 0101------------- 5的補碼
----------
0000 1101------------- 12的補碼
應用:
a、特定位置取反。例如:設a=1001,將第2位取反,則可以用 a ^1011 實現。
b、不引入第三變數,交換兩個數的值。
例:a=1,b=2,交換兩個數的值
a=a^b;
b=a^b;
a=a^b;
001 011 011
^ 010 ^ 010 ^ 001
———— ———— ————
011 001 010
2、移位操作符
2.1 左移運算 <<(丟棄最高位,0補最低位):把乙個數的所有位都向左移動若干位。
例如:int i=1;i=i<<2; //這表示將i裡的值左移兩位。
分析:1的2進製是000...0001(這裡1前面0的個數和int的位數有關,32位機器,gcc裡有31個0),左移2位之後變成000... 0100,也就是10進製的4,所以說左移1位相當於乘以2,那麼左移n位就是乘以2的n次方了(注:有符號數不完全適用)
2.2 右移運算 >>:把乙個數的所有位都向右移動若干位。
例如:int i = 0x80000000;
i = i >> 1; //i的值不會變成0x40000000,而會變成0xc0000000
分析:符號位向右移動後,正數的話補0,負數補1,也就是組合語言中的算術右移。同樣當移動的位數超過型別的長度時,會取餘數,然後移動餘數個位。
總之,在c中,左移是邏輯/算術左移(兩者完全相同),右移是算術右移,會保持符號位不變.實際應用中可以根據情況用左/右移做快速的乘/除運算,這樣會比迴圈效率高很多.
Java移位操作符以及按位操作符
按位操作符 針對兩個整數引數中的對應位執行布林代數運算,並生成乙個結果。按位與 如果兩個輸入位都是1則生成乙個輸出位1,否則生成乙個輸出位0。按位或 如果兩個輸入位只要有一位是1則生成乙個輸出位1.否則生成乙個輸出位為0。按位異或 如果兩個輸入位只有其中一位是1那麼生成輸出位1,否則生成乙個輸出位為...
移位操作符
移位操作符 位移位運算子是將資料看成二進位制數,對其進行向左或向右移動若干位的運算。位移位運算子分為左移和右移兩種,均為雙目運算子。第一運算物件是移位物件,第二個運算物件是所移的二進位制位數。位移位運算子的運算物件 運算規則與結果 結合性如表2 16所示。移位時,移出的位數全部丟棄,移出的空位補入的...
移位操作符
左移 在左移位中,值最左邊的幾位被丟棄,右邊多出來的幾個空格則由 0 補齊。如上圖。右移 右移位操作存在乙個左移位操作不曾面臨的問題,從左邊移入新位時,可以選擇兩種方案。一種是邏輯移位,左邊移入位用 0 填充 另一種是算數移位,左邊移入的位由原來的符號位決定,符號位為 1 則移入的位均為 1 符號位...