原标题:Bit Twiddling Hacks 来自:http://graphics.stanford.edu/~seander/bithacks.html 作者:Sean Eron Anderson
与(&)
或(|)
非(~)
异或(^)
左移(<<)
无符号右移位(>>>)
带符号右移(>>)
boolean isNegative(int v) {
// 无符号右移
return (v >>> 31) == 1;
}
boolean oppositeSign(int x, int y) {
return ((x ^ y) < 0);
}
int abs(int v) {
// 带符号右移
int mask = v >> 31;
return (v + mask) ^ mask;// 或者:(v ^ mask) - mask;
}
int min(int x, int y) {
return y + ((x - y) & ((x - y) >> 31));
}
int max(int x, int y) {
return x - ((x - y) & ((x - y) >> 31));
}
boolean isPowerOfTwo(int v) {
return v > 0 && (v & (v - 1)) == 0;
}
int countOne(int v) {
int count = 0;
while (v != 0) {
v = v & (v - 1);
count++;
}
return count;
}
void swap(int x, int y) {
x = x ^ y;
y = x ^ y;
x = x ^ y;
//因为java是call by value,栈上x与y已经交换,但是堆中x与y不变
}
int morePowerOfTwo(int cap) {
final int MAXIMUM_CAPACITY = 1 << 30;
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
int getRightOne(int v) {
return v & (~v + 1);
}
int removeRightOne(int v) {
return v & (v - 1);// 或v - (v & (~v + 1));
}
int changeRightZero(int v) {
return v | (v + 1);
}