本文作者:riag
本文出处:http://blog.csdn.net/riag
声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明信息. 谢谢.
- 把一个字的最右侧的1改成0,这个可以用来检查一个无符号整数是否为2的幂:
x & ( x - 1 )
其结果: 0101 1000 => 0101 0000
- 检查一个无符号整数是否为2 n -1的形式,0-检测:
x & ( x + 1 )
- 找出最右侧的1,其他位为0;如果没有1,则生成所有均为0的字:
x & ( - x )
其结果: 0101 1000 => 0000 1000
- 找出最右侧的0, 其他位为0;如果没有0,则生成所有位为0:
( ~ x ) & ( x + 1 )
其结果: 1010 01111 => 0000 1000
- 找出后缀0的掩码,如果为x=0则生成所有位为1的字:
(~x)&(x-1) 或
~(x | -x) 或
(x & -x) -1
其结果: 0101 1000 => 0000 0111
- 找出最右侧的1和后缀0的掩码:
x ^ ( x - 1 )
其结果: 0101 1000 => 0000 1111
- 把字的后缀0置1,如果x=0则生成所有的位都为1的字:
x | ( x - 1 )
其结果: 0101 1000 => 010 1111
- 把最右侧连续的1变成0:
( ( x | ( x - 1 )) + 1 ) & x
其结果: 0101 1000 => 0100 0000
- 把字的最右侧的0改成1,如果没有0则生成所有位为1的字:
x | ( x + 1 )
其结果: 1010 0111 => 1010 1111
- 下一个具有同样数目1的更大的数