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 ...