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;

 

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()