【发布时间】:2013-10-14 17:07:59
【问题描述】:
识别 64 位掩码中所有设置位位置的最佳方法是什么。假设我的位掩码是 0xDeadBeefDeadBeef,那么最好的方法是识别其中设置位的所有位位置。
long long bit_mask = 0xdeadbeefdeadbeef;
unsigned int bit_pos=0;
while(mask) {
if((mask&1)==1) {
printf("Set bit position is:%d \n",bit_pos};
}
bit_pos++;
mask>>=1;
}
一种方法是循环遍历它,并检查是否设置了某个位,如果设置了,则返回计数位置并继续循环直到 MSB,因此对于 64 位,我将迭代直到我拥有所有如果设置了 MSB,则设置遍历的位或遍历所有 64 位,但必须有更好的方法吗?
【问题讨论】:
-
您想要count 设置的位数吗?或者一些二进制打印输出,例如“1101 1110 1010 1101 ...”。
-
您是否有权访问“计数尾随零”或“popcnt”指令?
-
您是在数一数,还是对一数的位置感兴趣?
-
由于提供的示例算法在遇到第一个设置位时停止,我认为这是所需的位置,而不是设置位的总数。考虑到another of the poster's questions 提供的上下文,这也是有意义的。显然需要设置位的位置,因此可以随机选择一个。
标签: c embedded bit-manipulation bitmask bit-masks