位运算要点总结

下面是小米公司2013校园招聘笔试题的一道选择题的第3题

参见Hackbuteer1的这篇博客http://blog.csdn.net/hackbuteer1/article/details/8484974    2013年小米校园招聘笔试题

3.运算(93&-8)的结果为:  88


具体运算过程如下:

93 :  0x005D     0000 0000 0101 1101
-8 :   0xFFF8     1111   1111  1111  1000
-------------------------------------------------------
88       0x0058     0000  0000  0101 1000


其实二进制的位运算并不是很难掌握,因为位运算总共只有5中运算:与(&)、或(|)、异或(^)、左移(<<)、右移(>>)。

与、或和异或运算的规律总结如下表所示:



左移运算符m<<n表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。比如:

00001010<<2 = 00101000
100001010<<3 = 01010000

右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但右移时处理最左边位的情形要稍微复杂一点。如果数字是一个无符号数值,
则用0填补最左边的n位。如果数字是一个有符号的数值,则用数字的符号位填补最左边的n位。也就是说如果数字原先是一个正数,则右移之后在最左边补
n个0;如果数字原先是负数,则右移之后在最左边补n个1。下面是对两个8位有符号数作右移的例子:

00001010>>2 = 00000010
10001010>>3 = 11110001

还有一个规律是对于正数右移1位的结果相当于原来的数字除以2得到值,所以我们在编程中可以运用这个规律来提高程序的效率,因为位运算是计算机
底层的运算,所以效率会很高的。当然左移1位相当于原来的数乘以2得到的值。

在编程中有许多问题我们可以通过位运算的规律来解决,有时既可以保证程序运行的效率,也可以很巧妙的解决编程问题。

关于位运算的一些编程题可以参见何海涛的《剑指offer 名企面试官精讲典型编程题》一书的2.4.3 位运算 ,里面的许多编程题都很经典,练习一下,不尽对
准备面试笔试很有帮助,对与编程能力的提过也是很有帮助的。


下面再看一道新颖的关于进制的题目
(阿里巴巴笔试题,本人在参加腾讯2014校园招聘的笔试题中也遇到了类似的题目。这种题在何海涛先生的 《剑指offer 名企面试官精讲典型编程题》中也有提到过
11、假设在n进制下,下面的等式成立,n值是() 567*456=150216
A、9                B、10                 C、12                     D、18


解题思路如下:(参考 Hackbuteer1的博客 http://blog.csdn.net/hackbuteer1/article/details/6902917)
这种题类似于2进制的解法。
假设是X进制,则567=7+6*X+5*X^2,456=6+5*X+4*X^2,所以564*456=(7+6*X+5*X^2)*(6+5*X+4*X^2)而150216=6+X+2*X^2+5*x^4+X^5,由于567*456=150216,则6+X+2*X^2+5*x^4+X^5=(7+6*X+5*X^2)*(6+5*X+4*X^2),最后解出来X=18


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值