问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

算法:求N!的二进制表示中最低位1的位置,这里的位置是指什么位置

发布网友 发布时间:2022-04-14 23:27

我来回答

2个回答

懂视网 时间:2022-04-15 03:48

题目: 对于一个字节的无符号整数变量,求其中的二进制表示中1的个数,要求算法执行效率尽可能高效。 题目解析: 这道题同样在【剑指offer】面试题10:二进制中1的个数中出现,不过在剑指offer中没有提到无符号数,因此比该题目中多考虑一个层次。下面总结这


题目:

对于一个字节的无符号整数变量,求其中的二进制表示中1的个数,要求算法执行效率尽可能高效。


题目解析:

这道题同样在【剑指offer】面试题10:二进制中1的个数 中出现,不过在剑指offer中没有提到无符号数,因此比该题目中多考虑一个层次。下面总结这道题的几种解法。


解法一(用于该题目):

我们通常会想到除以2就是将二进制右移一位,但要判断移除的是0还是1,就要对2取余。思路很简单,通过四则运算来解答:

int Count(Byte v)
{
 int num = 0;
 while(v){
 if(v%2)
  num++;
 v /= 2;
 }
 return num;
}

解法二(用于该题目):

对于除以2来表示二进制右移,除法的效率比直接移位的效率低得多。碰到这样的题目,尽量用移位来代替。位运算就五种形式:与、或、异或、左移和右移。在这些范围里面找到自己想要的运算。移位时要判断移除的是0还是1,那么这里就应该通过与操作判断最后一位是否为1。

int Count2(Byte v)
{
 int num = 0;
 while(v){
 if(v & 1)
  num++;
 //也可以用 num += v&1; 来代替上面两行
 v = v >> 1;
 }
 return num;
}

解法三(可以用于有符号数):

如果这个题目是有符号的话,当右移的时候,会在高位补充符号位,用上面两种方法的话,会陷入死循环。如何避免?可以先判断最高位,然后遍历n-1次判断除了最高位以外的位是否为1。这样的方法比较麻烦。我们可以变通一个思路,让与的那一位1不断的左移,直到将1移到最高位。

int Count3(Byte v)
{
 int num = 0;
 int flag = 1;
 while(flag){
 if(v & flag)
  ++num;
 flag = flag << 1;
 }
 return num;
}

解法四(更加高效的算法):

这种方法,充分利用了二进制的相关操作,平时应该多收集这样的运算。

一个数不为0,那么二进制中肯定含1。当让这个数减去1时,最低位的1由1->0,更低位的0由0->1。当让n与n-1相与以后,n中最低位的1变成0。一次这样的操作,消去一个1,那么二进制中有多少个1,就循环多少次即可。

int Count4(Byte v)
{
 int num = 0;
 while(v){
 ++num;
 v = v & (v-1);
 }
 return num;
}


解法五(空间换时间方法):

其实方法四已经够好了,但是因为只涉及到八位,我们可以利用选择直接选取相应的数据。比如0x1-0x2-0x4...这些都包含1个1;0x3-0x6...包含两个1;等等。通过switch语句选择相应的结果。但是这种方法效率可能比较低,因为,当输入v为255的时候,得比较到最后才能找到相应的数据。

int Count5(Byte v)
{
 int num = 0;
 switch(v){
 case 0x0:
 num = 0;
 break;
 case 0x1:
 case 0x2:
 ....
 }

 return num;
}

解法六(哈希表法):

既然想到了利用空间换时间,我们干脆用个数组来表示,index为要查找的数,counttable[index]为该数据包含1的个数。







热心网友 时间:2022-04-15 00:56

你看的这一版的编程之美这里应该是印刷错误了 6的二进制表示应该是(0110) 而不是(1010)

书上的意思是从右向左数 最右边为第一位
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
推荐一款在卧室听的音响,最好带CD,带收音机,可插U盘,价格1000以内!尽量... 求问,近几年还会有类似于声之形、你的名字这样的动漫电影么w_百度... 苦学包括什么 北京世纪百奥科技有限公司怎么样? 居住证积分需要哪些材料 上海办居住证积分需要什么资料 居住证积分有哪些材料 如何建立良好的家庭情感氛围 如何让家庭氛围更快乐 如何营造一个欢乐轻松的家庭氛围呢? 半永久纹眉后多久可以补色 纹眉一个月后补色,没时间可以延长吗 纹眉两个星期可以补色吗?纹瞎了 二进制表示中最低位1的位置,这里的位置是指什么位 鱼腥草能生吃吗 鱼腥草是生吃还是熟吃好 怎样就可以用一个月的时间,提升男生的整体形象和气质? 用什么东西可以让睫毛长长呢 怎么样才能使睫毛自然长长? 用什么可以让睫毛长长 睫毛脱落,怎样可以使睫毛再次长长 骨癌晚期能活多久?我的母亲得了晚期骨癌!有什么更好的办法吗? 女生过生日祝福语幽默 千恩万谢!骨癌晚期,骨头开始痛,还能拖多久? 辛丑牛年没有立春这个对联什么时候贴正确? 男兔女鸡可以结婚吗? 明天 后天能贴对联吗? 为什么不能贴 骨癌晚期 该怎么办? 骨癌晚期的老人吃的止疼药有什么,谢谢了 属相婚配:男属兔和女属鸡相配吗? 如何评价梁家辉在《国家宝藏》中饰演的“司马光”? 如何评价梁家辉在《国家宝藏》中饰演的“司马光”? 历届香港金马影帝得主 历届香港金马影帝得主 全国最出名的竹主题公园有哪些? 种树树苗长成大树需要好多年 而竹子很快就长成了一片竹林 那为什么搞绿化只种树而不种竹子呢? 双眼皮埋线加抽脂,我想知道双眼皮埋线手术如何抽脂,是用针管将脂肪抽出,还是用刀子把脂肪割掉,因为毕 广德太极洞风景区如何玩?玩什么? 求好心人分享跟着书本去旅行免费在线观看资源 贺岁片上了哪几部 惠普打印机显示设置8位管理员? 抽脂埋线双眼皮需要恢复多久? 武汉竹叶海公园,确实要建设一个未来主题公园吗?什么时候开工! 惠普m437n设置8位管理员怎么取消 跟着书本去旅行竹节人制作过程视频 抽脂埋线双眼皮要拆线,眼皮会不会松,下垂,凹陷,也有的说抽脂会更紧绷,求解答,急急急 惠普打印机出现设置8位管理员怎么取消 抽脂埋线双眼皮是不是恢复的比较慢,一般多长时间可以好 先吸脂再埋线好,还是直接割双眼皮好 抽脂埋线双眼皮拆除可以吗