自己用实现c++中的__builtin_popcount()
功能相同的代码。
// c++ 中__buitin_popcount()作用是统计一个数中二进制形式下1的个数
// int x = 7;
__builtin_pop(x);
以上代码将返回3
我们可以自己写一段代码来实现该函数相同的功能。
int x = 7,cnt = 0;
while(x > 0){
x &= (x-1);
cnt++;
}
以上代码便实现了__builtin_popcount()
相同的功能,cnt最后的值为3。
这段代码使用了位操作符,执行了一种常见的技巧,用于将整数变量 x
的最低位的1清零。
x &= x - 1;
这行代码可以将 x
的二进制表示中的最低位的1变为0。具体的过程如下:
x - 1
:将x
减去1。这一步会将x
的最低位的1变为0,并且将该1的右侧的所有位都取反(翻转)。x &= x - 1
:使用按位与操作符&
,将x
与x - 1
的结果进行按位与运算。这会将x
的最低位的1与其余位保持不变,而将最低位的1的右侧所有位清零。
通过执行 x &= x - 1;
这行代码,可以实现清除 x
的最低位的1的效果。这种技巧常被用于统计一个整数中包含的二进制位数,或者用于检查一个整数是否为2的幂。
可自行将x
取值为奇数或偶数进行模拟,会发现结果是正确的。