常识# 与操作和补码

微博上有人出了几道小题目,也有人做出了不错的回答。就此我个人总结复习下。

1. 把一个数提升到8的倍数。如1->8, 8->8, 11->16, 23->24。

(x+7) & -8

2. 已知消息长度 x,要求补齐到最近的 8 的倍数,用一个表达式写出需要 padding 的字节数

-x & 7

 

解题思路和常识

这类题目普通的思路是求余,这里用到是与操作和补码。

先说下补码

补码不难,正数的补码和原码相同。

负数的补码分两步:取反然后加上1,相当于(~x+1)。所以: (ps: 下面的一些代码是运行在scala里)

scala> println(Integer.toBinaryString(8))
1000

scala> println(Integer.toBinaryString(-8))
11111111111111111111111111111000

scala> println(Integer.toBinaryString(~8+1))
11111111111111111111111111111000

scala> println(Integer.toBinaryString(7))
111

再说下与操作

X & -8 什么意思么? 看下上面的结果就很清楚了,将X的最后三位清零。

X & 7 什么意思么? 就是只保留最后三位。

 

解题

1. ( X + 7 )  & -8

提升到八的倍数,就是能被八整除,没有余数。所以尝试造成第四位的进位,然后清除后三位。

2. -x & 7  (我自己的答案是 8 - x & 7)

以八为模,-1补码的后三位是7 , -2补码的后三位是6。1+7=8; 2+6=8。也就是说 -3 & 7 + 3 = 8。

即 x 和 -x & 7 互为补数。(这里更深层次的说法似乎还要再调查下。)

 

 

posted @ 2012-12-02 00:08  倚楼无语F5  阅读(291)  评论(0编辑  收藏  举报