位操做技巧

本文發佈於遊戲程序員劉宇的我的博客,長期更新,轉載請註明源地址http://www.javashuo.com/article/p-gyurjyiy-bp.htmlhtml

須要補充或者修改的請留言~程序員

1. 取第n位的值(從右邊)函數

int r = (v >> n) & 1;

2.把某一位置1(從右邊)spa

v = v | (1 << n);

3.把某一位取反(從右邊)code

v = v ^ (1 << n);

4.把最後一個1置0htm

v = v & (v - 1);

5.把最後一個0置1blog

v = v | (v + 1);

6.奇偶判斷遊戲

(v & 1)

7.計算絕對值get

int a = v >> 31;
int r = (v ^ a) - a;
或者 int r = (v + a) ^ a;

8. 取模博客

//v % (2^n)能夠轉化爲去掉n位以前的值
int mod = v & (2^n - 1); 

9.乘2的n次方

int r = v << n;

10.除2的n次方

int r = v >> n;

 11.除2的餘

int r = v & 1;

12. 判斷語句 v == a ? b : a;

v = a ^ b ^ v;

 13.a與b互換

void swap(int& x , int& y)
{
     x ^= y;
     y ^= x;
     x ^= y;
}

14.否爲2的冪

bool power2(int v)
{
    return ((v & (v - 1)) == 0) && (v != 0);
}

15,求整數的平均值

int average(int x, int y)
{    
    return (x & y) + ((x ^ y) >> 1);
}

16.取v的符號

int v;
int sign;
//返回-1或0
sign = -(v < 0);
sign = v >> (sizeof(int) * CHAR_BIT - 1);
//返回-1或+1
sign = +1 | (v >> (sizeof(int) * CHAR_BIT - 1);
//返回-1,0,1
sign = (v != 0) | -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
sign = (v != 0) | (v >> (sizeof(int) * CHAR_BIT - 1));
sign = (v > 0) - (v < 0);

17.判斷兩數符號是否相反

bool f = ((a ^ b) < 0);

18.沒有分支語句的min或者max函數

//min(a,b)
int r = b ^ ((a ^ b) & -(a < b));
//max(a,b)
int r = a ^ ((a ^ b) & -(a < b));

19.是否取反(不帶判斷語句)

bool negative;
int r = (v ^ -negative) + negative;

20.根據掩碼mask合併a和b, mask爲1的位爲b的值,反之爲a的值

unsigned int r = a ^ ((a ^ b) & mask);

21.計算二進制v中1的個數n

unsigned int v;
unsigned int n;
for (n = 0; v; n++)
  v &= v - 1

22.二進制位反轉

unsigned int
reverse(register unsigned int x)
{
    x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
    x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
    x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
    x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
    return((x >> 16) | (x << 16));
}

22.二進制位反轉2

unsigned int
reverse(register unsigned int x)
{
  register unsigned int y = 0x55555555;
  x = (((x >> 1) & y) | ((x & y) << 1));
  y = 0x33333333;
  x = (((x >> 2) & y) | ((x & y) << 2));
  y = 0x0f0f0f0f;
  x = (((x >> 4) & y) | ((x & y) << 4));
  y = 0x00ff00ff;
  x = (((x >> 8) & y) | ((x & y) << 8));
  return((x >> 16) | (x << 16));
}

23.浮點數與0的判斷

#define FasI(f)  (*((int *) &(f)))
#define FasUI(f) (*((unsigned int *) &(f)))
#define lt0(f)    (FasUI(f) > 0x80000000U)
#define le0(f)    (FasI(f) <= 0)
#define gt0(f)    (FasI(f) > 0)
#define ge0(f)    (FasUI(f) <= 0x80000000U)

24.下一個2的冪次方

unsigned int nextpowerof2(register unsigned int x)
{
  x |= (x >> 1);
  x |= (x >> 2);
  x |= (x >> 4);
  x |= (x >> 8);
  x |= (x >> 16);
  return(x+1);
}

24.保留最高位的1 (上一個2的冪次方)

unsigned int lastpowerof2(register unsigned int x)
{
  x |= (x >> 1);
  x |= (x >> 2);
  x |= (x >> 4);
  x |= (x >> 8);
  x |= (x >> 16);
  return(x & ~(x >> 1));
}
相關文章
相關標籤/搜索