前言
最近在面试中遇到一个关于位运算的题目
如下图
请问这个aString
打印值是多少
学过位运算我们都知道 9<<4位 用2进制表示就是0000 1001
如果按照我之前的算法就是 0000 10001 向左位运算4 得到 1001 0000
这个时候我们得到的值就是 128+16 =144
拿到144这个值我们再通过java自带的静态方法 转16进制toHexString()
通过进制转换工具我们得出 144 +1 = 145 转换 16进制就是 91
说明
这个题目的91
答案是错误的!!
当时我也是一脸懵逼 不知道为什么错
最后面试官告诉我答案是120! 但是我就是知道了答案 也不知道是怎么来的
然后我自己编写测试代码 跑了一次这个函数 得到的结果依然是120。
这下我无语了
反向推理
我们知道答案16进制下的120是正确答案
那么16进制120转10进制是多少呢?
我们拿到结果是288
这个288 我们继续按照进制转换 用2进制来表示看下是怎样的
二进制:1 0010 0000
256 32
这样计算下来就是256+32=288
二进制:1 0010 0000 左边移动了五位
如此我们可以得到结论
上面这个函数 9<<4+1 其实是先算的4+1 再做的位运算
然后去验证这个推理 查了一下位运算和算数运算的优先级关系
得到下图: