怎么样知道一个数第一个为1的bit是第几位?

tankejin 2011-02-09 11:47:24
循环移位判断的方法除外是否有别的方法?
...全文
1804 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2011-02-09
  • 打赏
  • 举报
回复
从高位数还是从低位数?
欣客 2011-02-09
  • 打赏
  • 举报
回复
参考http://blog.csdn.net/steedhorse/archive/2009/11/14/4809493.aspx

能对你有启发。
cookie_qian 2011-02-09
  • 打赏
  • 举报
回复
我是新来的 我觉得是不是可以这样 :

根据数在十进制中的大小

从右往左数,第一位 【0,1】
第二位 【2,3】
第三位 【4,7】

……

从左往右只要减一下就好了哈
qq120848369 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ugly927846 的回复:]
参考http://blog.csdn.net/steedhorse/archive/2009/11/14/4809493.aspx

能对你有启发。
[/Quote]

两码事,不过里边提到的查表法值得借鉴,针对楼主的问题只要稍作改动即可。

以4bit对应的整数做为查表下标,比如:

table[0011]=table[3]=0;
table[1100]=table[12]=2;
talbe[0000]=table[0]=-1;

唯一特别的就是0000情况,所以标记table[0000]=-1。

举例,给定数字n=0011 0000; 初始化pos=0;

取n的低4位,table[0000]=table[0]=-1; 是特殊情况,所以pos=pos+4=4=0+4=4;
取n的高4位,table[0011]=table[3]=0; 所以,pos=pos+0=4+0=4; 程序结束;

打印pos=4,即n的二进制第4位为1;
zhongjilei 2011-02-09
  • 打赏
  • 举报
回复
int n = 0;
__asm
{
bsr eax, num
mov n, eax
}

masmaster 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ugly927846 的回复:]
参考http://blog.csdn.net/steedhorse/archive/2009/11/14/4809493.aspx

能对你有启发。
[/Quote]

学习~~~
hengshan 2011-02-09
  • 打赏
  • 举报
回复
咋查,上代码[Quote=引用 7 楼 taodm 的回复:]
查表法是最快的。
[/Quote]
taodm 2011-02-09
  • 打赏
  • 举报
回复
查表法是最快的。
hengshan 2011-02-09
  • 打赏
  • 举报
回复
采用分治法,32位整数,最对5次运算

unsigned ffs(unsigned n)
{
if (n == 0)
return 0;


unsigned c = 32;

if (!(n & 0xffff0000))
{
c -= 16;
n <<= 16;
}
if (!(n & 0xff000000))
{
c -= 8;
n <<= 8;
}
if (!(n & 0xf0000000))
{
c -= 4;
n <<= 4;
}
if (!(n & 0xc0000000))
{
c -= 2;
n <<= 2;
}
if (!(n & 0x80000000))
{
c -= 1;
}

return c;
}
wxwlll 2011-02-09
  • 打赏
  • 举报
回复
做一下十进制转化为二进制的算法功能,在里面填一个统计余数位置的计数器!
Lactoferrin 2011-02-09
  • 打赏
  • 举报
回复
嵌入汇编最方便
int a,b;
__asm bsf eax,b
__asm mov a,eax
完了后a里面就是b的第一个1的位置,从右往左数
如果从左往右数就bsr

70,011

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧