本文發佈於遊戲程序員劉宇的我的博客,長期更新,轉載請註明源地址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)); }