1. C / C++ 位元與移位運算子
(1.1) NOT (~):反相位元, 取補數
(1.2) AND (&):有0則0, a&0=0, a&1=1
(1.3) OR (|):有1則1, a|0 =a, a^1=1
(1.4) XOR (^):奇1則1, a^0=a, a^1=~a
(1.5) >> :向右移位, a >> n 即 a 向右移 n 個 bits
(1.6) << :向左移位, a << n 即 a 向左移 n 個 bits.
※ 移位運算子不會移動 Signed bit.
2. 乘以2的n次方
int a, b;
a = b*128;
a = b << 7; // 128 = 2^7
3. 除以 2 的 n 次方
int a, b;
a = b / 128;
a = b >> 7; // 128 = 2^7
4. 浮點數轉整數
int a;
float b;
a = (int)(b);
a = b >> 0;
5. 交換二整數(int, unsigned, char)數值
int a=10, b=5;
a^=b;
b^=a;
a^=b;
// 較不佳寫法:a^=b^=a^=b;
6. 判斷是否為奇數 (mask)
int a=10;
if(a%2==0) // return 1, 奇數
else // return 0, 偶數
if(a&(0x01)) // return 1, 奇數
else // return 0, 偶數
7. 整數(int) 取負數(變號)
int a, b;
b = -a;
b = ~a+1;
b = (a ^ -1) + 1;
8. 取2的n次方餘數
int a, b, c;
a = b % c; // c = 2^n
a = b & (c-1);
9. 判斷是否為2的n次方
int a;
if( (a & -a) == a) // return 1, 為2之n方
else // return 0, 非2之n方
10. 遞增運算子與遞減運算子
int a;
a = -~a; //a++;
a = ~-a; // a--;
11. 取低4bits位元(mask)
unsigned a, b;
b = a & 0x0f; // a取低4bits給 b
12. 取高4bits位元(mask)
unsigned a, b; // assume unsigned int has 4(32bits) bytes.
b = a&(0xf000 0000); // a 取高4bits 給b
13. 取絕對值
int a, b; // assume int has 4 bytes.
a = b<0 ? -b : b;
b = (a ^ (a>>31)) - (a >> 31);
14. 比較是否同號
int a, b, equ;
equ = (a*b > 0);
equ = (a^b >= 0);
15. 影像 RGB 技巧 (假設 unsigned 4bytes)
unsigned R, G, B, RGB;
分離:
R = RGB >> 16;
G = (RGB >> 8) & 0xff;
// G = (RGB<<8) >> 16;
B = RGB & 0xff;
合併:
RGB = (R<<16) | (G<<8) | B;
留言列表