C語言位運算子

2021-06-22 19:41:15 字數 3634 閱讀 5969

一.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語言提供的位運算子列表 運算子 含義 描述 按...