C語言複習0 2 位運算

2021-07-31 16:00:22 字數 3085 閱讀 7948

可以使用c對變數中的個別位進行操作。您可能對人們想這樣做的原因感到奇怪。這種能力有時確實是必須的,或者至少是有用的。c提供位的邏輯運算子和移位運算子。在以下例子中,我們將使用二進位制計數法寫出值,以便您可以了解對位發生的操作。在乙個實際程式中,您可以使用一般的形式的整數變數或常量。例如不適用00011001的形式,而寫為25或者031或者0x19.在我們的例子中,我們將使用8位數字,從左到右,每位的編號是7到0。

4個位運算子用於整型資料,包括char.將這些位運算子成為位運算的原因是它們對每位進行操作,而不影響左右兩側的位。請不要將這些運算子與常規的邏輯運算子(&& 、||和!)相混淆,常規的位的邏輯運算子對整個值進行操作。

按位取反~

一元運算子~將每個1變為0,每個0變為1,如下:

~(10011010)

01100101

假設a是乙個unsigned char,已賦值為2.在二進位制中,2是00000010.於是-a的值為11111101或者253。請注意該運算子不會改變a的值,a仍為2。

unsigned char a = 2;   //00000010

unsigned char b = ~a; //11111101

printf("ret = %d\n", a); //ret = 2

printf("ret = %d\n", b); //ret = 253

位與(and) : &

二進位制運算子&通過對兩個運算元逐位進行比較產生乙個新值。對於每個位,只有兩個運算元的對應位都是1時結果才為1。

(10010011) 

& (00111101)

= (00010001)

c也有乙個組合的位與-賦值運算子:&=。下面兩個將產生相同的結果:

val &= 0377

val = val & 0377

ps:

乙個數 &1的結果就是取二進位制的最末位。這可以用來判斷乙個整數的奇偶,二進位制的最末位為0表示該數為偶數,最末位為1表示該數為奇數。

位或(or) : |

二進位制運算子|通過對兩個運算元逐位進行比較產生乙個新值。對於每個位,如果其中任意運算元中對應的位為1,那麼結果位就為1.

(10010011)

| (00111101)

= (10111111)

c也有組合位或-賦值運算子: |=

val |= 0377

val = val | 0377

ps:

or運算通常用於二進位制特定位上的無條件賦值,例如乙個數or 1的結果就是把二進位制最末位強行變成1。如果需要把二進位制最末位變成0,對這個數or 1之後再減一就可以了。

位異或 : ^

二進位制運算子^對兩個運算元逐位進行比較。對於每個位,如果運算元中的對應位有乙個是1(但不是都是1),那麼結果是1.如果都是0或者都是1,則結果位0.

(10010011)

^ (00111101)

= (10101110)

^=不說了自行腦補

用法

開啟位

flag | ~flag

(10011010)

|(01100101)

=(11111111)

關閉位

flag & ~flag

(10011010)

&(01100101)

=(00000000)

轉置位

flag ^ 0xff

(10010011)

^(11111111)

=(01101100)

交換兩個數

//a ^ b = temp;

//a ^ temp = b;

//b ^ temp = a

(10010011)

^(00100110)

=(10110101)

(10110101)

^(00100110)

10010011

左移

左移運算子《將其左側運算元的值的每位向左移動,移動的位數由其右側運算元指定。空出來的位用0填充,並且丟棄移出左側運算元末端的位。

在下面例子中,每位向左移動兩個位置。

(10001010) << 2

(00101000)

左移一位相當於原值*2.

1 << 1 = 2;

2 << 1 = 4;

4 << 1 = 8;

8 << 2 = 32

右移

右移運算子》將其左側的運算元的值每位向右移動,移動的位數由其右側的運算元指定。丟棄移出左側運算元有段的位。對於unsigned型別,使用0填充左端空出的位。對於有符號型別,結果依賴於機器。空出的位可能用0填充,或者使用符號(最左端)位的副本填充。

//有符號值

(10001010) >> 2

(00100010) //在某些系統上的結果值

(10001010) >> 2

(11100010) //在另一些系統上的結果

//無符號值

(10001010) >> 2

(00100010) //所有系統上的結果值

用法

移位運算子能夠提供快捷、高效(依賴於硬體)對2的冪的乘法和除法。

number << n

number乘以2的n次冪

number >> n

如果number非負,則用number除以2的n次冪

複習C語言 位運算

0x01 按位與 作用 1 清零。如果想讓乙個單元清零,即使其全部二進位制位為0 2 取乙個數中某些指定位。即將想要的那些位置1.例 如有乙個整數a 2個位元組 想要其中的低位元組,只需將a與 377,8進製 00000000 11111111 按位與即可。3 要想將哪一位保留下來,就與乙個數 運算...

c 語言的位運算子複習

和修正,原文連線 位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制...

c語言位運算

c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0 按位或 兩個相應的二進位制位中只要有乙個為1,該位的結果值為1 按位異或 若參加運算的兩個二進位制位值相同則為0,否則為1 取反 是一元運算子,用來對乙個二進位制數按位取反,即將0變1...