位运算
利用二进制运算的特性来进行一些优化。非常的神奇
认识有哪些位运算符号
^ 按位异或
& 按位与
| 按位或
~ 按位取反
// >> 算术右移
// << 算术左移
这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char、short、int 与 long 类型。
位运算符号使用的一些情节
常用的一些操作:(x表示的是0或者1)
x^0 = x
x^1 = ~x
x^x = 0
x&0 = 0
x&1 = x
x&x = x
x|0 = x
x|1 = 1
x|x = x
具体的一些例子的讲解
目标 | 例子 | 操作 |
---|---|---|
在最后加一个0 | 101101->1011010 | x<<1 |
在最后加一个1 | 101101->1011011 | (x<<1)+1 |
把最后一位变成1 | 101100->101101 | x | 1 |
把最后一位变成0 | 101101->101100 | (x|1) - 1 |
最后一位取反 | 101101->101100 | x ^ 1 |
把右数第K位变成1 | 101001->101101,k=3 | x |(1<<(k-1)) |
把右数第K位变成0 | 101101->101101,k=3 | x & ~(1<<(k-1)) |
右数第k位取反 | 101001->101101,k=3 | x ^ (1<<(k-1)) |
取末三位 | 1101101->101 | x &7 |
取末k位 | 1101101->1101,k=5 | x & (1<<k-1) |
取右数第k位 | 1101101->1,k=4 | x >> (k-1)&1 |
把末k位变成1 | 101001->101111,k=4 | x|(1<<k-1) |
末k位取反 | 101001->100110,k=4 | x^(1<<k-1) |
把右边连续的1变成0 | 100101111->100100000 | x&(x+1) |
把右起第一个0变成1 | 100101111->100111111 | x|(x+1) |
把右边连续的0变成1 | 11011000->11011111 | x|(x-1) |
取右边连续的1 | 100101111->1111 | (x^(x+1))>>1 |
去掉右起第一个1的左边 | 100101000->1000 | x&(x^(x-1)) |