C语言 两道位操作的面试题
来源:互联网 发布:excel标注重复数据 编辑:程序博客网 时间:2024/06/06 21:04
1、把一个32位的数按位反转,就是第32位转到第1位,第31位转到第2位…………
什么样的算法最节省效率?
参考http://www.yuanma.org/data/2007/0723/article_2763.htm
unsignedint bit_reverse(unsignedint n)
{
n =((n >> 1)& 0x55555555)|((n << 1)& 0xaaaaaaaa);
n =((n >> 2)& 0x33333333)|((n << 2)& 0xcccccccc);
n =((n >> 4)& 0x0f0f0f0f)|((n << 4)& 0xf0f0f0f0);
n =((n >> 8)& 0x00ff00ff)|((n << 8)& 0xff00ff00);
n =((n >> 16)& 0x0000ffff)|((n << 16)& 0xffff0000);
return n;
}
第一行代码为奇偶位相互交换;第二行为以两位为一单元,奇偶单元进行交换;第三行为以四位为一单元,奇偶单元进行交换;第四行为以八位为一单元,奇偶单元进行交换;最后一行为以十六位为一单元,奇偶单元进行交换。至此,32位反转完成,算法结束。
上述奇偶、2、4、8、16的交换方法可以演变有四种实现形式,本质一样,可以都先移后取、都先取后移以及一个先移后取、另一个先取后移
受上面程序启发,可以考虑16、8、4、2、奇偶来实现交换,即先将左右整体换边,再处理局部换边的问题,
将32位分成两个16位的箭头,折半互换有两种实现方式:
一,先把每个箭头换向,整体分别左移或右移16位,即可;问题是每个箭头怎么换向?问题又成了16位数怎么折半互换,再分成两个8位的箭头,如上方法,依次实现,最后就是奇偶互换了,可以形成递归算法;或者将1的思路反相考虑,直接奇偶互换,2、2互换,4、4互换,8、8互换,16、16互换即可,是一种倒推条件的方法,对应于原作者的方法。
二,先把两个箭头的位置互换,即16、16互换;再将每个箭头分成两份,两组8、8互换,依次类推,4组4、4互换,8组2、2互换,16组奇偶互换,实现方法和思考方法一致。
第二种方法更容易想到,借鉴了二分查找的思想,逐层分半。
如果为面试,要是你很快写出上述算法,一种说明你是天才,另外一种说明你以前做过此题,那么考察就没有意义了,只能说明你准备充分,不能说明你有多牛;当然天才是很少的了,他立刻随便再出个题,如果你也能很快搞定,那可能真说明你是天才,可是这样的概率太小了;咱们还是老实点吧,肯定不能说咱们做过,又不能说自己是天才,那要想装牛B怎么办呢?
- C语言 两道位操作的面试题
- C语言之简单的位操作面试题
- C语言面试题---操作符的优先级
- c语言的面试题
- C语言面试题之字符串操作
- C语言面试题
- C语言面试题
- C语言面试题
- C语言面试题
- c语言面试题
- c语言面试题
- C语言面试题
- c语言面试题
- C语言面试题
- C语言面试题
- c语言面试题
- C语言面试题
- C语言面试题
- openstack学习资料
- 经典SQL语句资料大全之开发案例
- MyEclipse 8.5 Latest中文汉化教程(强力推荐哦,刚试过,ok)
- 感觉都不会了(2012.09.21)
- Nagios简介
- C语言 两道位操作的面试题
- Oracle Patch (1) - CPU
- 从12306火车购票网站谈海量事务高速处理系统
- 某网友总结的grep、sed、awk、perl等对正则表达式的支持的差别,谁给贴个网址
- QT实例之十五(qtdemo)
- 【成功案例】Reebonz - 电子商务网站节省80%的基础设施成本
- 移植libgsoap libssl libcrypto到arm(arm-hismall-linux)
- The Struts dispatcher cannot be found. This is usually caused by
- 9步开发出一款iPhone应用