C 中位運算

2022-05-17 13:37:33 字數 3210 閱讀 2106

1 位邏輯運算子:

& (位   「與」)  and ----------------- 2個都為1 才是1-----------0^0 = 0 , 0^1 = 0,  1^0 = 0  1^1= 1 

^  (位   「異或」) ---------------------相同為0,不同為1--------0^0 = 0 , 1^1 = 0,  1^0 = 1  1^0 = 1 

|   (位    「或」)   or------------------有乙個是1 就是1 -------------0^0 = 0 , 0^1 = 1,  1^0 = 1  1^1 = 1 

~  (位   「取反」)

2 移位運算子:

<<(左移)

>>(右移)

優先順序&運算通常用於二進位製取位操作,例如乙個數 &1的結果就是取二進位制的最末位。

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

| 運算通常用於二進位制特定位上的無條件賦值,例如乙個數|1的結果就是把二進位制最末位強行變為1

如果需要把二進位制最末位變成0,對這個數 |1之後再減一就可以了,其實際意義就是把這個數強行變成最近接的偶數

leetcde:

^運算通常用於對二進位制的特定一位進行取反操作,^運算的逆運算是它本身,也就是說兩次異或同乙個數最後結果不變,即(a^b)^b=a;

^運算可以用於簡單的加密,比如原始值int a = 19880516;金鑰 int key =1314520; 進行加密 int data=key^a = 20665500;解密 data^key == a;

^運算還可以實現兩個值的交換而不需要中間變數,例如:

先看加減法中交換實現

void swap(long int &a,long int &b)

a = a+b;

b = a-b;

a = a-b;

void swap(long int &a,long int &b)

a = a^b;

b = a^b;

a = a^b;

所以 ^運算可以理解成類似加法(+)記憶 , 1+1 =0,1+0 =1,0+1 =1;0+0 =0;//因為機器碼是二進位制,1+1=2%2 =0,其實不然

~運算的定義把記憶體中的0和1全部取反,所以~運算時要格外小心,你需要注意整數型別有沒符號,如果~的物件是無符號整數(不能表示負數),

那麼他的值就是它與它的上界限的之差,因為無符號型別的數是用0000

到'>0000到

0000到ffff依次表示的。

1.如果乘上乙個2的倍數數值,可以改用左移運算(left shift) 加速 300%

x = x * 2;

x = x * 64;

//改為:

x = x << 1; // 2 = 21

x = x << 6; // 64 = 26

2.如果除上乙個 2 的倍數數值,可以改用右移運算加速 350%

x = x / 2;

x = x / 64;

//改為:

x = x >> 1;// 2 = 21

x = x >> 6;// 64 = 26

3.數值轉整數加速 10%

x = int(1.232)

//改為:

x = 1.232 >> 0;

4.交換兩個數值(swap),使用 xor 可以加速20%

var t:int = a;

a = b;

b = t;

//equals:

a = a^b;

b = a^b;

a = a^b;

5.正負號轉換,可以加入 300%

i = -i;

//改為

i = ~i + 1; // not 寫法

//或i = (i ^ -1) + 1; // xor 寫法

6.取餘數,如果除數為 2 的倍數,可利用 and 運算加速 600%

x = 131 % 4;

//equals:

x = 131 & (4 - 1);

7.利用 and 運算檢查整數是否為 2 的倍數,可以加速 600%

iseven = (i % 2) == 0;

//equals:

iseven = (i & 1) == 0;

8.加速 math.abs 600% 的寫法1,寫法2 又比寫法1加速 20%

//寫法1

i = x < 0 ? -x : x;

//寫法2

i = (x ^ (x >> 31)) - (x >> 31);

//寫法3

i=x^(~(x>>31)+1)+(x>>31);

9.比較兩數值相乘之後是否擁有相同的符號,加速 35%

eqsign = a * b > 0;

//equals:

eqsign = a ^ b > 0;

其它位運算技巧

1. rgb色彩分離

var 24bitcolor:uint = 0xff00cc;

var r:uint = 24bitcolor >> 16;

var g:uint = 24bitcolor >> 8 & 0xff;

var b:uint = 24bitcolor & 0xff;

2. rgb色彩合併

var r:uint = 0xff;

var g:uint = 0x00;

var b:uint = 0xcc;

var 24bitcolor:uint = r << 16 | g << 8 | b;

0000

到'>參考:

0000

到'>參考:

C 中的位運算

程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算就是直接對整數在記憶體中的二進位制位進行操作。在c 中可以對整型運算物件按位進行邏輯運算 c 支援的位邏輯運算子如下所示 1.位邏輯非 是乙個單目運算子,只有乙個運算物件。0變成1,1變成0。例如 二進位制1000 1101 進行位邏輯...

c 中的位運算子

位邏輯非運算是單目的,只有乙個運算物件。位邏輯非運算按位對運算物件的值進行非運算,即 如果某一位等於0,就將其轉變為1 如果某一位等於1,就將其轉變為0,對二進位制的10010001進行位邏輯非運算,結果等於01101110。用十進位制表示就是 145等於110 對二進位制的01010101進行位邏...

C 位運算 示例

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