位運算介紹與簡單應用示例

2021-09-29 10:46:01 字數 3046 閱讀 6061

位運算在演算法的編寫,程式的簡化中有著極其重要的作用。

首先我們來了解以下什麼是位運算(以c語言為例)

位運算是基於二進位制來進行計算的,而乙個數字以二進位制在計算機進行儲存的時候都會以補碼的方式進行儲存。此處涉及的原碼 反碼 補碼 我就不做贅述了,讀者可以自己去查查計算機基礎類的書,一般都會有介紹。

接下來我們對位運算子進行介紹。

位運算分為 6 種,它們是:

按位與 按位或 按位異或 按位取反 左移運算 右移運算

下來我們對這幾個運算子進行解釋(位運算的運算元是整數型別或字元型.)

我們以char舉例 char在記憶體中佔乙個位元組 0000 0000 範圍是 -128 – 127

我們做出如下定義

char a=5;

char b=

6;

我們對這兩個數分別做不同的位運算

5的二進位制儲存**是 0000 0101

6的二進位制儲存**是 0000 0110

0000 0101

0000 0110

& 進行運算時比較相同的位數 特點是全1為1 有0為0.

0000 0101

0000 0110

0000 0100 結果是4

| 進行運算時比較相同的位數 特點是有1為1 全0為0.

0000 0101

0000 0110

0000 0111 結果是7

^進行運算時比較相同的位數 特點是不同為1 相同為0

0000 0101

0000 0110

0000 0011 結果是3

~是單目運算子(單目意為只對乙個物件進行操作)

~進行運算時會將二進位制中的0變成1 ,1變成0

0000 0101

1111 1010

此處需要注意的乙個坑是計算機中負數的儲存 負數進行儲存的時候會對原碼取反加1

因此 1111 1010 這個數其實代表的二進位制數是是多少呢?

我們需要對它進行減一取反

1111 1010

1111 1001 減一後的值

1000 0110 取反後的值

結果是-6

有人可能會疑惑為什麼第乙個1沒有變呢 這個在這裡就先不做解釋了 感興趣的同學可以自己去了解。

《和》運算子

左移運算將數對應的二進位全部向左移動若干位,高位丟棄,低位補 0。左移運算的運算子為 <

右移運算將數對應的二進位全部向右移動若干位。對於左邊的空位補的是符號位。右移運算的運算子為 >>。舉個例子,將數字5右移 1 位,其實是將數字 80 對應的二進位制 0000 0101 中的二進位向右移動 1 位

#include

#include

intmain()

執行結果

1.編寫函式:

unsigned int reverse_bit(unsigned int value);

這個函式的返回值是value的二進位制位模式從左到右翻轉後的值。

思路 我們可以建立兩個變數 end進行儲存 mid當作』中間人『

利用中間人 從value的最低位進行儲存 每儲存一次 我們對value進行》 對end<<

將mid賦初值為0,通過|運算來讀取value末位是否為零 再通過|存入end

**如下

#include

#include

unsigned

intreverse_bit

(unsigned

int value)

return end;

}int

main()

2.輸入乙個整數陣列,實現乙個函式,

來調整該陣列中數字的順序使得陣列中所有的奇數字於陣列的前半部分,

所有偶數字於陣列的後半部分

思路 這其實是一種排序的 但是是對奇偶的一種排序

首先我們利用位運算進行奇偶的乙個判斷 a[i]&1 奇數得1 偶數得零

我們從第乙個元素開始 如果是偶數我們將它與最後乙個元素進行交換

然後對陣列長度減一 (對定義出的長度變數減一)

繼續從當前元素開始迴圈

直到某次迴圈沒有呼叫15324

#include

#include

void

oddeven

(int

* a,

int len)}}

}int

main()

;int len =5;

oddeven

(a, len)

;for

(int i=

0;i)system

("pause");

return0;

}

3.程式設計實現:

一組資料中只有乙個數字出現了一次。其他所有數字都是成對出現的。

請找出這個數字。(使用位運算)

思路相同為零 不同為一 這是異或的特點 因此一組數中有相同的數時會異或為零

因為不用考慮運算順序 因此最後的返回值會是乙個 只出現一次的值!

#include

#include

intmain()

;int len =

sizeof

(a)/

sizeof

(a[0])

;int t = a[0]

;for

(int i =

1; i < len; i++

)printf

("%d\n"

, t)

;system

("pause");

return0;

}

位運算及簡單應用

老實說,我對 一些比較簡單的運算子比較熟悉。對位運算就陌生了,主要用的少。我覺得高手用的會比較多,因為位運算速度比較快。1.如果兩個相應的二進位制位都為 則該位的結果值為1 否則為0。注 下面都用8位的 unsigned char 來做例子。11 3 3 00001011 00000011 0000...

C 位運算講解與示例

今天在專案中遇到按位或組合許可權串的問題 首先每乙個許可權數都是2的n次方數 如 k1 2 新增 k2 4 刪除 k3 8 修改 如此定義功能許可權數,當需要組合許可權時,就需要對各個所擁有的許可權數按位或了。如 purview k2 k3 賦給新增和刪除許可權 當需要判斷在許可權串中是否擁有某一許...

C 位運算講解與示例

在c 中可以對整型運算物件按位進行邏輯運算。按位進行邏輯運算的意義是 依次取被運算物件的每個位,進行邏輯運算,每個位的邏輯運算結果是結果值的每個位。c 支援的位邏輯運算子如表所示。運算符號 意義運算物件型別 運算結果型別 物件數例項 位邏輯非運算 整型,字元型整型1 a 位邏輯與運算 2a b 位邏...