- 1)公式: x & (x - 1).
- 公式可以将字组中的值为1且靠右的位元,变为0 。
- 如 0101 1110 => 0101 1100。
- 算法的原理:主要是 ( x -1 )这个操作,让x 中最右边的 1 变为了 0 ,然后在 &(与) 由于 & 是当两个都为 1 时才会为 1,所以说保证了其它位都不变。
- 0101 1110 = x
- 0101 1101 = (x - 1) 然后对这两个数进行与运算。
- 0101 1100 = 结果
- 2)公式: x | (x + 1)
- 公式可以将字组中的值为 0 且靠右的位元,变为 1。
- 如 1010 0111 => 1010 1111。
- 算法的原理:主要是 ( x +1 )这个操作,让x 中最右边的 0 变为了 1 ,然后在 |(或) 由于 | 是当一个都为 1 时就会为 1。
- 1010 0111 = x
- 1010 1000 = (x - 1) 然后对这两个数进行或运算。
- 1010 1111 = 结果
- 3)公式: x & (x + 1)
- 公式可以将字组尾部的 1 都变成 0,如果尾部没有 1 ,则x 不变。
- 如 1010 0111 => 1010 0000
- 算法的原理:主要是 (x + 1)起到的作用是,由于是二进制加 1后把,尾部的 1 全部变成了0,直到遇到0,把 0 变成了 1。在进行 &(与) 操作。就达到了例子的结果。
- 1010 0111 = x
- 1010 1000 = (x + 1) 然后对这两个数进行与运算。
- 1010 0000 = 结果
- 4)公式: x & (x - 1)
- 公式可以将字组尾部的 0 都变成 1,如果尾部没有 0 ,则x 不变。
- 如 1010 1000 => 1010 0000
- 算法的原理:主要是 (x - 1)起到的作用是,把后面的0都变成了 1,又进行的是 &(与)操作,所以达到了这种结果。
- 1010 0111 = x
- 1010 1000 = (x - 1) 然后对这两个数进行与运算。
- 1010 0000 = 结果
- 5)公式: ┐x & (x + 1)
- 公式可以将字组最靠右的 0 变成 1,并将其余的位置 0 。
- 如 1010 0111 => 0000 1000
- 算法的原理:主要是 (x + 1)和 ┐x 起到的作用是,(x + 1)把后面的1都变成了 0,┐x 对 x 取反。又进行的是 &(与)操作,所以达到了这种结果。
- 1010 0111 = x
- 0101 1000 = ┐x
- 1010 1000 = (x + 1) 然后对这两个数进行与运算。
- 0000 1000 = 结果
- 6)公式: ┐x | (x - 1)
- 公式可以将字组最靠右的 1 变成 0,并将其余的位置 1。
- 如 1010 1000 => 1111 0111
- 算法的原理:主要是 (x - 1)和 ┐x 起到的作用是,(x - 1)把后面的0都变成了 1,┐x 对 x 取反。又进行的是 |(或)操作,所以达到了这种结果。
- 1010 1000 = x
- 0101 0111 = ┐x
- 1010 0111 = (x - 1) 然后对这两个数进行或运算。
- 1111 0111 = 结果
- 7)公式: ┐x & (x - 1) 或 ┐(x | -x) 或 (x & -x)-1
- 以上三个公式都可以将字组尾部所有值为 0 的位元变成 1,并将其余位元设为 0。
- 如 0101 1000 => 0000 0111
- 算法的原理:┐x & (x - 1)
- 0101 1000 = x
- 1010 0111 = ┐x
- 0101 0111 = (x - 1) 然后对这两个数进行与运算。
- 0000 0111 = 结果
- 算法的原理:┐(x | -x)
- 0101 1000 = x
- 1010 1000 = -x 然后对这两个数进行或运算
- 1111 1000 = 对或运算出的结果取反,┐x 。
- 0000 0111 = 结果
- 算法的原理:(x & -x)-1
- 0101 1000 = x
- 1010 1000 = -x 进行与运算。
- 0000 1000 = 然后结果,进行 -1 。
- 0000 0111 = 结果
- 公式: ┐x | (x + 1)
- 公式可以将字组尾部所有值为 1 的位元变成 0,并将其余位元设为 1,如果没有为 1 的位元,则运算结果都为 1 。
- 如 1010 0111 => 1111 1000
- 算法的原理:┐x | (x - 1)
- 1010 0111 = x
- 0101 1000 = ┐x
- 1010 1000 = (x + 1) 然后对这两个数进行或运算。
- 1111 1000 = 结果
- 公式: x & ( -x )
- 公式可以保留字组中最靠右且为 1 的位元,将其它位元变成 0,如果没有为 1 的位元,则运算结果都为 0 。
- 如 0101 1000 => 0000 1000
- 算法的原理:x & ( -x )
- 0101 1000 = x
- 1010 1000 = -x 然后对这两个数进行与运算。
- 0000 1000 = 结果
- 公式: x
- //该片段来自于http://www.codesnippet.cn/detail/0311201410887.html
来源: http://www.codesnippet.cn/detail/0311201410887.html