回答
你这里有多个答案:http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious 最简单的幸福,假设你有一个unsigned int v您输入值:
unsigned int r = 0; // r will be lg(v)
while (v >>= 1) // unroll for more speed...
{
r++;
}
但它会在这个过程中改变诉
编辑:你的情况,如果你是100%肯定你的输入和int和2的幂,查找表可能是最简单和最快的
Endianess与它有什么关系? – Skizz 2012-01-04 15:23:11
我相当肯定你的代码是正确的,没有考虑到它所运行的硬件系统的字节顺序。 – dasblinkenlight 2012-01-04 15:23:57
这是正确的。 – Jonathan 2012-01-04 15:24:52
这里有一个版本,只做五次迭代最多为32位值,与lezebulon的答案不同,后者的最坏情况是32次迭代。适应64位值将此版本的迭代次数增加到6次,其他次数增加到64次。
int get_pos (unsigned v)
{
int s=16,p=0,m=0xffff;
while (s)
{
if (v>>s) p += s;
v = (v | (v >> s)) & m;
s >>= 1;
m >>= s;
}
return p;
}
所有你需要做的就是循环和每次移动一点。但使用开关盒的方法更快。列出两个为你。
//more code but awesomely fast
int getBitOffset1(int d) {
switch(d) {
case 1: return 1;
case 2: return 2;
case 4: return 3;
case 8: return 4;
case 16: return 5;
case 32: return 6;
/* keep adding case upto sizeof int*8 */
}
}
//less code, the loop goes 64 times max
int getBitOffset2(int d) {
int seed=0x01;
int retval=0;
do{
if(seed<<retval == d) {
break;
}
retval++;
}while(retval<=sizeof(int)*8);
return retval+1;
}
int main() {
printf("%d\n", getBitOffset2(32));
printf("%d\n", getBitOffset2(1));
return 0;
}
- 1. 在SQLite3中获取ROWID的偏移量
- 2. 在C#中基于偏移量从浏览器中获取TimeZone
- 3. 将偏移量定位到光标位置的Javascript偏移量
- 4. Draw2D图与偏移获取位置
- 5. 在Mac上获取系统时区的UTC偏移量(C++)
- 6. C# - 从已知偏移量的文件中获取字节
- 7. 从固定内存偏移量中获取值:Visual C++编程
- 8. 文件中的偏移量存储在C中的位置?
- 9. 数组偏移量和位#
- 10. 使用MRJob获取字节偏移量
- 11. Treetop:获取节点的偏移量
- 12. 如何获取壁纸偏移量?
- 13. 获取日期无偏移量
- 14. 获取特定偏移量的BsonDocument
- 15. 获取contentpresenter的位置(大小和所有者的偏移量)
- 16. 从OSX获取屏幕分辨率和位置/偏移量
- 17. 获取元素相对于父容器的位置/偏移量?
- 18. jquery获取并设置文档偏移量(或位置?)
- 19. 获取给定位置的时区偏移量
- 20. 在C中使用指针偏移量#
- 21. 如何在logstash中获得偏移量?
- 22. 在JS中获取客户端时区(不是GMT偏移量)
- 23. 在Python中获取计算机的UTC偏移量
- 24. 在SQL Server中获取datetimeoffset的偏移量
- 25. 在$ wpdb中添加偏移量获取结果查询
- 26. 获取偏离屏幕的物体的偏移量
- 27. 从偏移量中选择一部分数据从偏移量到偏移量
- 28. 如何在C中获取嵌套结构成员的偏移量?
- 29. 从jquery获取偏移值
- 30. 获取精灵节偏移
你的意思是两个幂(6是不是一个)?在这种情况下,“位偏移”将是对数基2? – 2012-01-04 15:13:12
是的,请澄清。最好的问候, – 2012-01-04 15:16:31
幼稚的方法是循环和测试,但可能有一个本地CPU指令可以在一条指令中完成。 (“获得最少(或最多)显着位”) – 2012-01-04 15:17:50