如何求解一个无符号整形数是2的多少次方?
时间:2010-07-31
来源:互联网
就是一个unsigned整形数据只有一个bit位为1;求这个bit的位置;
问题背景,我用一个无符号整形数映射一个32个key值的使用情况;
现在需要求从后向前数,第一个0的bit位,用此bit生成一个特定的键值,键值本身有序;
所以我必须知道0bit位最低的那个字节,而且一定存在这个bit;
if (0xffffffff == unsignedi) return;
unsignedi = ~unsignedi; 转化为求从后向前数最低的一个为1的bit位;
unsignedj = unsignedi - (unsignedi & (unsignedi -1));
//如何继续进行计算unsignedj 对应bit的位置;------我不想一个一个bit找或者二分查找~~~
否则一开始就从后向前一个一个bit查找好的了~~~~~
问题背景,我用一个无符号整形数映射一个32个key值的使用情况;
现在需要求从后向前数,第一个0的bit位,用此bit生成一个特定的键值,键值本身有序;
所以我必须知道0bit位最低的那个字节,而且一定存在这个bit;
if (0xffffffff == unsignedi) return;
unsignedi = ~unsignedi; 转化为求从后向前数最低的一个为1的bit位;
unsignedj = unsignedi - (unsignedi & (unsignedi -1));
//如何继续进行计算unsignedj 对应bit的位置;------我不想一个一个bit找或者二分查找~~~
否则一开始就从后向前一个一个bit查找好的了~~~~~
作者: zbhddt6 发布时间: 2010-07-31
你觉得 bsf bsr 这两个汇编指令怎么样?
假如你必须用C的话,可以折半查找,比如
((a&0xFFFF0000!=0) ? 16 : 0)
+ ((a&0xFF00FF00!=0) ? 8 : 0)
+ ((a&0xF0F0F0F0!=0) ? 4 : 0)
+ ((a&0xCCCCCCC!=0) ? 2 : 0)
+ ((a&0xAAAAAAAA!=0) ? 1 : 0)
假如你必须用C的话,可以折半查找,比如
((a&0xFFFF0000!=0) ? 16 : 0)
+ ((a&0xFF00FF00!=0) ? 8 : 0)
+ ((a&0xF0F0F0F0!=0) ? 4 : 0)
+ ((a&0xCCCCCCC!=0) ? 2 : 0)
+ ((a&0xAAAAAAAA!=0) ? 1 : 0)
作者: bruceteen 发布时间: 2010-08-01
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28