一些二进制位判断技巧
2017年03月27日 星期一, 发表于 武汉
如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)
总结下目前已知的二进制数的一些特征判断技巧:
1.判断一个数是不是2^n
1 2 3 bool fun(int i){ return (i > 0) && ((i & (i - 1)) == 0); }
原理是假如x为2的N次方整数,由于2的N次方的数二进制表示是第1位(最高位)为1,其余为0,而x-1得到的数的二进制表示恰恰是第1位为0,其余为1,两者按位与,结果为0,否则假设不成立。
2.统计一个数,其二进制形式中0的个数
1 2 3 4 5 6 7 8 9 10 | int fun(unsigned int x) { int n = 0; while(x+1) { n++; x = x | (x+1); } return n; } |
其原理是,每次循环当中,把x的二进制从右往左的最后一位0变成1,当x全为1时,x+1溢出为0,结束循环,返回统计结果。
3.统计一个数,其二进制形式中1的个数
1 2 3 4 5 6 7 8 9 10 | int fun(unsigned int x) { int n = 0; while(x) { n++; x = x & (x-1); } return n; } |
其原理与2类似,每次循环当中,把x的二进制从右往左的最后一位1变成0,当x全为0时,结束循环,返回统计结果。注意循环条件和位运算表达式与2中的区别
如果其他技巧,未来再进行补充 -_-