如何求一个二进制数的最低位的1在哪里?
可知在计算机中数是以补码的形式储存的。 比如7,为111。-7为11111001。 其中求解-7的补码形式我们是怎么求解的呢? 负数原码转换为补码的方法之一: 符号位保持1不变,数值位按位求反,末位加1。 负数原码转换为补码的方法之二: 符号位保持1不变,在数值位中从低位向高位找1,第一个1及其右边的0保持不变,数值位的其余部分求反。
这两种方法大家试一试就会发现其实是一样的。 第一种方法是按照定义来设计的求解方式。 解释:一个正数的补码为原码自己,设为a,其负数形式的补码设为b, 可知a+b=0。方法一的求解方式就是先把这个数二进制中为0的哪些位给加上来,再加1,使得其进位,溢出为0. 如6=0000 0110,-6 = 1111 1001 + 1 = 1111 1010 可见最低位的1右边的0,在取反之后就会全部变为1,再加一,进位后,取反获取的1全部进位了,最低位的1又被进位上来了,即最低位的1保持不变。 方法二就是利用了这个性质,简化了求解过程中加1进位这一步.
于是我们可以利用补码正数和负数的这一点来快速求解一个数的最低位的1在哪里。 即n&-n 这样最低位的1被与运算保留下来,其他位全部置零。