如何快速求一个数的二进制最高位

RaceBug2010 2011-09-27 01:23:25
RT
求一个数x的二进制最低位可以通过下面函数
int lowbit(int x) {
return x & (-x);
}
但是求最高位好像没有特别好的方法。
...全文
2364 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-09-27
  • 打赏
  • 举报
回复
bool __bsr( u_long v, long *b )
{
if(v == 0)
return false;

__asm{
bsr eax, v
mov ebx, b
mov [ebx], eax
}
return true;
}
Michael_g 2011-09-27
  • 打赏
  • 举报
回复
c++函数版(VC)


//传入数字 ,结果是从最左边那个 1 以右边为基础从0开始的索引,如 传 0x110 返回 8 ,如果没有1,返回-1 ;
int BSI_L2R (int num)
{
int ret;
_asm{
mov ecx,num
xor eax,eax
bsr eax,ecx
jnz exitfun
or eax,0FFFFFFFFH
exitfun:
mov ret,eax
}
return ret;
}
Michael_g 2011-09-27
  • 打赏
  • 举报
回复
Asm 版本

.386p
.model flat,stdcall

.code
BSI_L2R proc uses ecx,num

mov ecx,num
xor eax,eax
bsr eax,ecx
jnz @F
or eax,0FFFFFFFFH
@@:
ret
BSI_L2R endp

end


在c++里调用


extern "C" int __stdcall BSI_L2R(int num);

int pos = BSI_L2R(0x110);

Michael_g 2011-09-27
  • 打赏
  • 举报
回复
传入数字 ,结果是从最左边那个 1 以右边为基础从0开始的索引,如 传 0x110 返回 8 ,如果没有1,返回-1 ;
int BSI_L2R2 (int num)
{
int ret;
_asm{
mov ecx,num
xor eax,eax
bsr eax,ecx
jnz exitfun
or eax,0FFFFFFFFH
exitfun:
mov ret,eax
}
return ret;
}
RaceBug2010 2011-09-27
  • 打赏
  • 举报
回复 1
[Quote=引用 11 楼 johnson_jiang327 的回复:]

移位操作
for(i=31;i>=0;i--)
{
int m = (x>>i)&1;
if(m)
return (i+1);
}
[/Quote]
这种最简单的方法,不优美。我是想有没有可以通过几次位运算算得结果的方法。
Johnson_Jiang327 2011-09-27
  • 打赏
  • 举报
回复
移位操作
for(i=31;i>=0;i--)
{
int m = (x>>i)&1;
if(m)
return (i+1);
}
RaceBug2010 2011-09-27
  • 打赏
  • 举报
回复
你们都没有理解我的意思,我要求的是最高位为1的那一位。
比如 hibit(7) = 4, hibit(6) = 4, hibit(10) = 8;
我给的那个函数 lowbit(7) = 1, lowbit(6) = 2, low(12) = 4;
crystalzheng 2011-09-27
  • 打赏
  • 举报
回复
有符号位就进行位操作吧..或者与二进制1000000...;
crystalzheng 2011-09-27
  • 打赏
  • 举报
回复
综上各位有符号位就判断正负
老菜 2011-09-27
  • 打赏
  • 举报
回复
最高位就是符号位嘛,判断正负不就完了
AndyZhang 2011-09-27
  • 打赏
  • 举报
回复
这个为什么麻烦知道吧?
因为你不知道多少位,不同类型有不同位数,含符号和不含符号的区别,所以没必要纠结

不过你倒可以封装一个这样的程序,求最高位。
Michael_g 2011-09-27
  • 打赏
  • 举报
回复
bool HightBit(int x}
{
return x & 0x80000000;
}
薛定谔之死猫 2011-09-27
  • 打赏
  • 举报
回复
通过位操作也可以的
int x;
...
x>>=sizeof(int)*8-1;

忘了是不是这么写,反正就这个意思
bdmh 2011-09-27
  • 打赏
  • 举报
回复
二进制不是1就是0,对于有符号数,就是正负,无符号数,跟 10000000 与操作
ohmygirl 2011-09-27
  • 打赏
  • 举报
回复
ls:有符号数和无符号数是不一样的。
薛定谔之死猫 2011-09-27
  • 打赏
  • 举报
回复
最高位就是符号位嘛,判断正负不就完了

69,373

社区成员

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

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