首页
社区
课程
招聘
[求助]如何高效计算出整型数占用的二进制位数
发表于: 2013-11-27 17:11 9655

[求助]如何高效计算出整型数占用的二进制位数

xhK 活跃值
3
2013-11-27 17:11
9655
如何高效计算出整型数占用的二进制位数,
例如:
2的二进制为 10,占用2个二进制位
3的二进制为 11,占用2个二进制位
4的二进制为 100,占用3个二进制位

怎么才能高效的计算呢

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谁说2只占2位的?

你这应该说是:确定整数二进制表示中第一个1 的出现位置。
2013-11-27 17:19
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3
Hamming Weight
2013-11-27 17:34
0
雪    币: 159
活跃值: (38)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
对,应该这么说
2013-11-27 17:34
0
雪    币: 441
活跃值: (149)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
最快?那查表!直接用你的数做数组索引,建一个大数组,个数是你想查最大的数。

数组前面几个值为

a[]=0 1 2 2 3 3 3 3 4
比如求8直接调用a[8]返回4

呵呵,牺牲空间换效率
2013-11-27 17:46
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
6
[log(x)] + 1
2013-11-27 17:52
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
左移 + 判断 ZF ?

对32位 二分查找。。。
2013-11-27 17:54
0
雪    币: 1392
活跃值: (5177)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
8
32位 比较五次就够了吧,当然数学的方法也可以试试,。比如LOG之类的
2013-11-27 18:05
0
雪    币: 251
活跃值: (468)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
對數非常慢,比較法較快。
2013-11-27 18:34
0
雪    币: 496
活跃值: (286)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
10
int f(int n)
{
    n = (n&0x55555555) + ((n>>1)&0x55555555);
    n = (n&0x33333333) + ((n>>2)&0x33333333);
    n = (n&0x0f0f0f0f) + ((n>>4)&0x0f0f0f0f);
    n = (n&0x00ff00ff) + ((n>>8)&0x00ff00ff);
    n = (n&0x0000ffff) + ((n>>16)&0x0000ffff);

    return n;
}
2013-11-27 19:15
0
雪    币: 807
活跃值: (2273)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
int f(int x)
{
  int n = 0 ;

  while(x) {
    x = x >> 1 ;
    n ++   ;
  }
  return(n) ;
}
2013-11-27 19:36
0
雪    币: 1847
活跃值: (1806)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
12
http://graphics.stanford.edu/~seander/bithacks.html

这里有很多
2013-11-27 21:36
0
雪    币: 159
活跃值: (38)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
13
嗯 的确不少 多谢
2013-12-2 10:01
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
while(a) {a=a>>1,count++};
2013-12-2 10:45
0
游客
登录 | 注册 方可回帖
返回
//