在本教程中,您將通過示例了解C語言編程中所有6個按位運算符。
在算術邏輯單元(位于CPU內)中,諸如位加法,減法,乘法和除法之類的數(shù)學運算是在位級別完成的。 要在C編程中執(zhí)行位級運算,請使用按位運算符。
運算符 | 運算符的含義 |
---|---|
&& | 按位與 |
| | 按位或 |
^ | 按位異或 |
~ | 按位補 |
<< | 左移位 |
>> | 右移位 |
如果兩個操作數(shù)的對應位為1,則按位與的輸出為1。如果一個操作數(shù)的任一位為0,則對應位的結果為0。
讓我們假設兩個整數(shù)12和25的按位與運算。
12 = 00001100(二進制) 25 = 00011001(二進制) 12和25的位運算 00001100 &00011001 ________ 00001000 = 8(十進制)
#include <stdio.h> int main() { int a = 12, b = 25; printf("Output = %d", a&b); return 0; }
輸出結果
Output = 8
如果兩個操作數(shù)的至少一個對應位為1,則按位OR的輸出為1。在C編程中,按|表示按位OR運算符。
12 = 00001100(二進制) 25 = 00011001(二進制) 12和25的按位或運算 00001100 | 00011001 ________ 00011101 = 29(十進制)
#include <stdio.h> int main() { int a = 12, b = 25; printf("Output = %d", a|b); return 0; }
輸出結果
Output = 29
如果兩個操作數(shù)的對應位相反,則按位XOR運算符的結果為1。用^表示。
12 = 00001100(二進制) 25 = 00011001(二進制) 12和25的按位XOR運算 00001100 ^ 00011001 ________ 00010101 = 21(十進制)
#include <stdio.h> int main() { int a = 12, b = 25; printf("Output = %d", a^b); return 0; }
輸出結果
Output = 21
按位補運算符是一元運算符(僅在一個操作數(shù)上起作用)。 它將1更改為0,將0更改為1。用~表示。
35 = 00100011(二進制) 35的按位補碼運算 ?00100011 ________ 11011100 = 220(十進制)
#include <stdio.h> int main() { printf("Output = %d\n",~35); printf("Output = %d\n",~-12); return 0; }
輸出結果
Output = -36 Output = 11
C語言編程中有兩個移位運算符:
右移運算符
左移運算符。
右移運算符將所有位向右移位指定數(shù)量的指定位。用>>表示。
212 = 11010100(二進制) 212 >> 2 = 00110101(二進制)[右移兩位] 212 >> 7 = 00000001(二進制) 212 >> 8 = 00000000 212 >> 0 = 11010100(無移位)
左移運算符將所有位向左移特定數(shù)量的指定位。用<<表示。
212 = 11010100(二進制) 212 << 1 = 110101000(二進制)[左移一位] 212 << 0 = 11010100(移位0) 212 << 4 = 110101000000(二進制)= 3392(十進制)
#include <stdio.h> int main() { int num=212, i; for (i=0; i<=2; ++i) printf("右移 %d: %d\n", i, num>>i); printf("\n"); for (i=0; i<=2; ++i) printf("左移 %d: %d\n", i, num<<i); return 0; }
輸出結果:
右移 0: 212 右移 1: 106 右移 2: 53 左移 0: 212 左移 1: 424 左移 2: 848