【发布时间】:2013-01-20 21:41:18
【问题描述】:
我有一个byte 用于位标志。我知道byte 中的只有一个 位在任何时候都被设置。
例如:unsigned char b = 0x20; //(00100000) 6th most bit set
我目前使用以下循环来确定设置了哪个位:
int getSetBitLocation(unsigned char b) {
int i=0;
while( !((b >> i++) & 0x01) ) { ; }
return i;
}
如何最有效地确定设置位的位置?我可以在没有迭代的情况下做到这一点吗?
【问题讨论】:
-
假设一个 8 位字节,使用查找表可能会有所帮助,除非您可以使用“计数前导零”原语/指令。
-
"我可以不用迭代就做到这一点吗?"使用查找表或 switch 语句。
-
我希望得到一个有点小技巧的破解,而不是明显的
switch声明 -
您可以进行三个比较和一些数学运算。它实际上会比这个循环更快吗?很难说。
-
如果这是您的瓶颈,那么您将无法击败查找表。我猜您实际上并没有进行任何分析,并且在没有受益的情况下进行了优化。
标签: c optimization bit-manipulation bitflags