在計算機中所有資料都是以二進位制的形式儲存的。位運算其實就是直接對在記憶體中的二進位制資料進行操作,因此處理資料的速度非常快。
在實際程式設計中,如果能巧妙運用位操作,完全可以達到四兩撥千斤的效果,正因為位操作的這些優點,所以位操作在各大it公司的筆試面試中一直是個熱點問題。
基本的位操作符有與、或、異或、取反、左移、右移這6種,它們的運算規則如下所示:
注意以下幾點:
下面對位操作的一些常見應用作個總結,有判斷奇偶、交換兩數、變換符號及求絕對值。這些小技巧應用易記,應當熟練掌握。
判斷奇偶
只要根據最未位是0還是1來決定,為0就是偶數,為1就是奇數。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)來判斷a是不是偶數。
下面程式將輸出0到100之間的所有奇數。
for (i = 0; i < 100; ++i)
if (i & 1)
printf("%d ", i);
putchar('\n');
交換兩數一般的寫法:
void swap(int &a, int &b)
}
可以用位操作來實現交換兩數而不用第三方變數:
void swap(int &a, int &b)
}
可以這樣理解:再來個例項說明下以加深印象。int a = 13, b = 6;
a的二進位制為 13=8+4+1=1101(二進位制)
b的二進位制為 6=4+2=110(二進位制)
變換符號
變換符號就是正數變成負數,負數變成正數。
做法就是取反加1
int signreversal(int a)
求絕對值位操作也可以用來求絕對值,正數就直接是他本身,對於負數可以通過對其取反後加1來得到正數。
先移位來取符號位,int i = a >> 31
;要注意如果a為正數,i等於0,為負數,i等於-1。然後對i進行判斷——如果i等於0,直接返回。否之,返回~a+1。完整**如下:
int my_abs(int a)
現在再分析下。對於任何數,與0異或都會保持不變,與-1即0xffffffff異或就相當於取反。因此,a與i異或後再減i(因為i為0或-1,所以減i即是要麼加0要麼加1)也可以得到絕對值。所以可以對上面**優化下:
int my_abs(int a)
位運算詳解
首先我們需要清楚位運算的一些基本知識。與 a b 或 a b 非 a 異或 a b int 32位 1 0000000.1 2 0000000.10 3 0000000.11 補碼 表示計算機中的負數 a 1是a的補碼即 a memset a,0x3f,sizeof a 把這個a所佔的全部位元組初始...
位運算操作符詳解二
位運算是指進行二進位制的運算。在系統軟體中,常需要處理二進位制位的問題。例如,將乙個儲存單元中的各二進位制位左移或右移一位,兩個數按位相加等。c語言提供位運算的功能。運算子 含義 按位與 按位或 按位異或 取反 左移 右移 說明 位運算子中,除了 取反以外,均為二目 元 運算子,即要求兩側各有乙個運...
C C 位操作 位運算
在c語言中,可以單獨操控變數的位 bit 一般高階語言不會處理這級別的細節,c在提供高階語言便利的同時,還能為組合語言所保留的級別上工作,這使其成為編寫裝置驅動程式和嵌入式 的首選語言。目錄 二進位制整數 binary 有符號整數 八進位制 octal 十六進製制 hex 位運算子 按位與 的用途 ...