一.c語言位運算子簡介
c語言的位運算子有六種,分別是:
>> 右移運算子
<< 左移運算子
& 按位與運算子
| 按位或運算子
^ 按位異或運算子
~ 按位取反運算子
這些運算子都是對於基本資料型別的二進位制位進行操作的,這裡我們只討論整型資料型別的位運算
二.各個運算子的具體使用
>> 右移運算子:將整數的二進位制形式整體向右移動,移動過後左邊缺的位的填充取決於編譯器,可能是算術右移也可能是邏輯右移
<< 左移運算子:將整數的二進位制形式整體向左移動,移動過後右邊缺的位用0補全
邏輯右移:在位移的過程中,符號位左邊可能移入新的位,移入的新位用0填充,則稱為邏
輯移位算術右移:在位移的過程中,符號位左邊可能移入新的位,移入的新位由符號位決定,符號位為
1則移入的新位用1補充,符號位為0則用0補充,保持原數的正負不變,這樣的移位
方式稱為算術移位.
具體是邏輯右移還是算術右移取決於編譯器
(我使用的編譯器為
vs,為算術右移)
注意:沒有邏輯左移和算術左移 例:
[cpp]view plain
copy
print?
int a = 10;
int b = 20;
int c = -2;
int d = -25;
printf("%d\n",a>>1);
printf("%d\n",b<<2);
printf("%d\n",c<<2);
printf("%d\n",d>>3);
輸出結果:
5 40
-8
-4
int a = 10;
int b = 20;
int c = -2;
int d = -25;
printf("%d\n",a>>1);
printf("%d\n",b<<2);
printf("%d\n",c<<2);
printf("%d\n",d>>3);
輸出結果:540
-8-4
分析:10 (28個0)1010
右移1位 0(28個0)101 = 5
在我剛剛接觸位運算的時候我對d的位移結果很是不解
因為:-25 二進位制為 1(26個0)11001
位移後為 1111(26個0)11 結果怎麼看都不是-4
實際上在計算機的位移運算中,正數和負數的運算都是使用補碼的形式運算
正數的補碼 = 正數的原碼
負數的補碼 = 負數的原碼除符號位外按位取反 + 1;
負數的原碼 = (負數的補碼-1)再對除符號位之外按位取反
負數的儲存實際上也是以負數的補碼儲存的 所以
-25 二進位制為 1(26個0)11001
-25 在程式中為 1(26個1)00111
位移後為 1111(26個1)00
再換為二進位制原碼形式 1(26個0)00100 為 -4
& 按位與運算子 對兩個運算元的二進位制每一位進行,1&1=1,1&0=0,0&1=0,0&0=0
| 按位或運算子 對兩個運算元的二進位制每一位進行,1|1=1,1|0=1,0|1=1,0|0=0
例子程式:
[cpp]view plain
copy
print?
int a = -1;
int b = 2;
int c = 4;
printf("%d\n",b & c );
printf("%d\n", b | c );
printf("%d\n",a & b );
printf("%d\n", a | b );
輸出:
0 6
2 -1
int a = -1;
int b = 2;
int c = 4;
printf("%d\n",b & c );
printf("%d\n", b | c );
printf("%d\n",a & b );
printf("%d\n", a | b );
輸出:062
-1
正數就不再分析了
負數還是按補碼的形式
-1 補碼 1(29個1)11
2 補碼 0(29個0)10
進行按位或運算為 1(30個1)1 轉換為負數原碼剛好為-1
進行按位與運算為 0(29個0)10 為2
^ 按位異或運算子 對兩個運算元的二進位制數每一位進行1^1=0,0^1=1,1^0=1;0^0=1
~ 取反運算子 對運算元的二進位制每一位進行,取反1->0,0->1
這兩種運算子也是基於補碼進行運算的
三.位運算子的具體應用
[cpp]view plain
copy
print?
列印乙個數的二進位制形式
void printbit(int a)
printf("\n");
} 不使用臨時變數實現兩個數值交換
void swap(int *a,int *b)
取出a中的第n位
int getbit(int a, int n)
將a中的第n位設為0
void setbitzero(int *a,int n)
將a中的第n位設為1
void setbitone(int *a,int n)
求a的相反數
a = ~a+1;
列印乙個數的二進位制形式
void printbit(int a)
printf("\n");
}不使用臨時變數實現兩個數值交換
void swap(int *a,int *b)
取出a中的第n位
int getbit(int a, int n)
將a中的第n位設為0
void setbitzero(int *a,int n)
; int main()
for( i = 0 ; i < n ; ++i )
return 0 ;
}
#define maxn 3125010
int vis[maxn] = ;
int main()
for( i = 0 ; i < n ; ++i )
return 0 ;
}
使用了c語言的位運算子,在陣列的乙個記憶體空間中儲存32個數字是否存在的資訊,這樣既節省下來了記憶體空間,也使得查詢數字時候時間複雜度為o(1) C語言 位運算子
位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 1 按位與 運算子 按位與是指 參加運算的兩個資料,按二進位制位進行...
C語言 位運算子
位操作符,主要包括 與,或 符 取反符 移位符 異或符 開始前先看一段實現二進位制輸出的 方便觀察位操作 參考鏈結知乎作者 碼農愛學習 void printf bin int num printf 每8位加個空格,方便檢視 printf r n 與0清0,與1不變 功能1 提取位資料 功能2 清除 ...
C語言位運算子
語言位運算子 與 或 異或 取反 左移和右移 位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按...