有助于理解数的二进制表示的两道笔试题

本文解答了两道编程面试题:一是不使用基本运算符实现整数加一的操作;二是判断一个整数是否为2的幂次方,且仅用一行代码实现,避免使用循环。解答基于对二进制数的深入理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两道笔试题,大家帮忙看一下... http://topic.youkuaiyun.com/u/20081029/10/ee84a378-bdd0-41ec-a4af-916ba59baaba.html

1.已知x,不用+,-,*,/符号,计算出x+1的值;
2.检验一个整数是否为2的n次方数,要求用一行代码,而且不能使用循环语句。

如果对数值的二进制表示相当熟悉,而且聪明的话,应该不是问题。

第1题的解法:

  1. intadd1(intx)
  2. {
  3. inti=1;
  4. while(x&i)
  5. {
  6. x&=(~i);
  7. i=i<<1;
  8. }
  9. x|=i;
  10. returnx;
  11. }

如果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) - 猛禽的编程艺术 - 优快云Blog http://blog.youkuaiyun.com/Raptor/archive/2007/11/19/1893079.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值