有助于理解数的二进制表示的两道笔试题
来源:互联网 发布:倾斜数据的金字塔模型 编辑:程序博客网 时间:2024/05/22 05:04
两道笔试题,大家帮忙看一下... http://topic.csdn.net/u/20081029/10/ee84a378-bdd0-41ec-a4af-916ba59baaba.html
1.已知x,不用+,-,*,/符号,计算出x+1的值;
2.检验一个整数是否为2的n次方数,要求用一行代码,而且不能使用循环语句。
如果对数值的二进制表示相当熟悉,而且聪明的话,应该不是问题。
第1题的解法:
- int add1(int x)
- {
- int i = 1;
- while(x&i)
- {
- x &=(~i);
- i = i<<1;
- }
- x |= i;
- return x;
- }
如果x是正数,那么abs(~x)就可以了,对于负数abs(~x)是达不到目的的。利用了数是按补码形式表示的,负数的补码就是该数绝对值的二进制码各位取反然后加1得到的,我们就利用这个加1来符合题意。对于正数,abs(~x)确实就可以啦,但是如果x是负数呢?而前面那个函数add1是不分正负数都可以操作的,这也是因为数是补码表示的的缘故。
第2题 检验一个整数是否为2的n次方数,要求用一行代码,而且不能使用循环语句。解法:
x&(x-1) == 0 //该式如果成立,则x是2的某次方
如果x是2的某次方,那么这个数的二进制表示中只有一位是1,其他全是0,那样的话,x-1就是低位是1高位是0分成截然不同的两段的。
当然了,这个题用那种一个二进制位一个二进制位判断一下的办法也是可以实现的,一行的话,那就。。。
参考:
补码_百度百科 http://baike.baidu.com/view/377340.htm
补码 - 维基百科,自由的百科全书 http://zh.wikipedia.org/w/index.php?title=%E8%A1%A5%E7%A0%81&variant=zh-cn
有符号数处理 - 维基百科,自由的百科全书 http://zh.wikipedia.org/w/index.php?title=%E6%9C%89%E7%AC%A6%E8%99%9F%E6%95%B8%E8%99%95%E7%90%86&variant=zh-cn
abs函数是怎么实现的呢?有没有用加减乘除符号呢?
这个,abs是主要靠位操作巧妙实现的,不过还是用了个减操作,见 GCC的BUG研究(Rev.3) - 猛禽的编程艺术 - CSDNBlog http://blog.csdn.net/Raptor/archive/2007/11/19/1893079.aspx
- 有助于理解数的二进制表示的两道笔试题
- 二进制数的表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- MFC 教程【13_MFC工具条和状态栏 】
- ADD_APPLICATION_MENUITEM()和ADD_APPLICATION_MENUITEM2()的异同
- Recast Digital 推出 DVD 品质的 Web 视频
- 2008.11.05
- MFC 教程【14_SOCKET类的设计和实现】
- 有助于理解数的二进制表示的两道笔试题
- OpenCms自定义结构化类型
- 初来请多关照
- 实训C++语言设计——异常处理
- 修改Bugfree显示项实践
- Windows Media Player Firefox Plugin
- SQL SERVER 2005 分区,文件组
- 一个有趣的C程序
- 多款在网页中嵌入天气预报的方法