位運算相關總結

2021-08-18 12:43:34 字數 4571 閱讀 9346

按位與運算子(&)

參加運算的兩個資料,按二進位制位進行「與」運算

運算規則:兩位同時為1結果才為

1,否則為

0.負數按補碼形式參加按位與運算

「與運算」的特殊用途:

(1)清零。如果想將乙個單元清零,即使其全部二進位制位為0,只要與乙個各位都為

0的數值相與,結果為

0.(2)取乙個數中指定位

方法:找乙個數,對應x要取的位,該數的對應位為

1,其餘位為

0,此數與

x進行「與運算」可以得到

x中的指定位。

按位或運算子(|)

特殊作用:

(1)常用來對乙個資料的某些位置1.

方法:找到乙個數,對應x要置

1的位,該數的對應位為

1,其餘位為

0,。此數與

x相或可使

x中的某些位置

1.例:將x=10100000的低4位置

1,用x|0000 1111=1010 1111

可得到。

異或運算子(^)

參加運算的兩個資料,按二進位制位進行「異或」運算

運算規則:參加運算的兩個物件,如果兩個相應位為「異」(值不同),則該位結果為1

,否則為0。

特殊作用:

(1)使特定位翻轉找乙個數,對應x要翻轉的各位,該數的對應位為

1,其餘位為

0,此數與

x對應位異或即可。

例:x=10101110,使x低

4位翻轉,用

x^0000 1111=1010 0001

即可得到。

(2)與0相異或,保留原值,

x^00000000=1010 1110

。按位異或其實就是不進製加法,如1+1=0,0+0,1+0=1.

異或的幾條性質:

1. 交換律

2. 結合律( a ^ b ) ^ c == a ^ ( b ^ c )

3. 對於任何數x,都有

x^x=0,x^0=x

4. 自反性:a ^ b ^ b = a ^ 0 = a;

異或運算最常見於多項式除法,不過它最重要的性質還是自反性:a xor b xor b = a,即對給定的數

a,用同樣的運算因子(

b)作兩次異或運算後仍得到

a本身。這是乙個神奇的性質,利用這個性質,可以獲得許多有趣的應用。 例如,所有的程式教科書都會向初學者指出,要交換兩個變數的值,必須要引入乙個中間變數。但如果使用異或,就可以節約乙個變數的儲存空間: 設有

a,b兩個變數,儲存的值分別為a,

b,則以下三行表示式將互換他們的值 表示式 (值) :

a=a^b;

b=b^a;

a=a^b;

應用舉例:

1~1000放在

1001

個元素的陣列中,只有唯一的乙個元素值重複,其他均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空間,能否設計乙個演算法實現?

解法一:把所有數加起來,減去1+2+……

+1000

的和。但問題是如果數列過大,則可能會導致溢位。

解法二:將所有數全部異或,得到的結果與1^2^3^…

^1000

的結果進行異或,得到的結果就是重複數。

左移運算子(

<<)

將乙個運算物件的各二進位制位全部左移若干位(左邊的二進位制位丟棄,右邊補0)。

例:a=a<<2將

a的二進位制位左移

2位,右補

0,左移1位後

a=a*2

右移運算子(>>)

將乙個數的各二進位制全部右移若干位,正數左補0,負數左補

1,右邊丟棄。

運算元每右移一位,相當於該數除以2.

例如:a=a>>2將

a的二進位制位右移

2位,左補

0 or 補1

得看被移數是正還是負。

符合賦值運算子:

&=   例:

a &=b       

相當於a=a& b

|=   例:

a |=b       

相當於a=a |b

>>=  例:

a >>=b      

相當於a=a>> b

<<= 例:

a<<=b      

相當於a=a<< b

^=   例:

a ^= b      

相當於a=a^ b

不同長度的資料進行位運算

如果兩個長度不同的資料進行位運算時,系統會將二者按右端對齊,然後進行位運算。

以「與」運算為例:

如果乙個long型別資料與乙個

int型別資料進行「與」運算,右端對齊後,左邊不足的位依下面三種情況補足,

(1)如果整型資料為正數,左邊補16個0。

(2)如果整型資料為負數,左邊補16個1。

(3)如果整型資料為無符號位,左邊也補16個0。

位運算:將乙個字元型二進位制數字轉換成10進製

int change(char *st)

int main()

位操作的運用

1. 奇偶性的判斷

對於二進位制表示來說,其最右位為1則該數為奇數,最右位為

0則該數為偶數。

int a;

cin>>a;

if( a & 1)

cout<<」奇數」<

2. 不借助變數交換兩個數

a=a^b;

b=a^b;

a=a^b;

3. 取相反數

將正數n變為

-n,將負數n變為

-n。將整數取反加1即可得到相反數:

常見等式:- n = ~ ( n - 1 ) = ~ n + 1

例子:求某整數的絕對值

int  my_abs(int  num)

return num;

}

4. 整數二進位制表示中最右邊的1

獲取整數二進位制表示中最右側的1:n & (-n)等價於

n & ~(n-1)

例如,n=1100,-n=0100,那麼

n & ( -n )=0100,

這樣就獲取到了二進位制表示中最右側的1。

去除整數二進位制表示中最右側的1:n & (n-1)

例如,n=1100,n-1=1011,那麼

n & (n-1)=1000,

這樣就去除了二進位制表示中最右側的1。

5.32位系統某數右移/左移

32位或更多位

在移位運算時,byte、

short

和char

型別移位後的結果會變成

int型別,對於

byte

、short

、char

和int

進行移位時,規定實際移動的次數和

32的餘數,也就是移位

33次和移位

1次得到的結果相同。

位運算相關題目

1、二進位制中

1的個數

用到了n & (n - 1)

(1)方法一:參考文章:整數的二進位制表示中

1的個數

方法二:二進位制位的翻轉和二進位制表示中1的個數

(2) 輸入兩個數a和

b,輸出將

a轉換為

b所需改變的二進位制的位數。

方法:首先,a異或

b得到的是a和

b中不相同位數組成的數,然後再求這個數二進位制表示中

1的個數,即為所求。

2、位操作的加減運算(用位操作實現加減)

加法和減法相似,因為根據異或的自反性,a+b也就相當於a+(-b);  相反數就是取反加一。

//1.加法操作

int binaryadd(int a, int b)

while (ca != 0);//迴圈直到某次運算沒有進製,運算結束

return add;

}

//2.減法操作

int binarysub(int a, int b)//減法操作就是加上乙個負數

3、求兩個數中較小的那個

y ^ ((x ^ y) & -(x < y))

分析:當x < y時,

-(x < y)為-1

,其補碼形式全為1,則

(x ^ y) & -(x < y) = x ^ y

,則上述表示式返回的是較小的數x;

當x >= y時,

-(x < y)為0

,補碼形式為全0,則

(x ^ y) & -(x < y) = 0

, 則表示式返回的是較小的數

y

位運算相關總結

計算機cpu中alu是由邏輯門構成的,非常善於位運算。因此,在程式中使用位運算,經常能夠加快程式執行。另外,掌握一些位運算的相關知識也能增加一些程式設計的樂趣。位運算經常使用到異或運算和與運算。異或運算符合交換律 結合律,它的特點是相同為0,不同為1。與運算是同為1則為1。詳細內容 1 兩個數比較大...

C語言 位運算相關總結

1.位運算符號 取反,不分正負數 標準規定在右邊補0 正數則左邊補0,負數標準沒有規定在左邊補充的數字,分為邏輯右移和算術右移,具體由編譯器決定,windows平台和gcc採取算術右移即負數補1 2.常見的二進位制位的變換操作 去掉最後一位 101101 10110 x 1 在最後加乙個0 1011...

位運算相關題目

面試中會遇到很多與位運算相關的題目,在這裡對位運算的相關知識點和遇到的一些題目總結一下。二進位制的5種位運算 與 或 異或 左移 m 右移 m n表示 把m右移n位 最右邊的n為會被丟棄,如果數值原來是個正數,用0補上最左邊的n位,如果是乙個負數,則最左邊補上n個1 題型一 進製轉換 微軟產品exc...