二进制表示
计算机使用二进制表示数字,加入使用8位二进制表示数字,每位取0或1,能表示2^8=256个数。
方案1:如果只表示非负整数,则最小为全0,最大为全1(255),表示范围为0~255,一共256个数字。
方案2: 如果希望能同时表示负数和非负数,则可以将最高位表示为符号位,比如 最高位为0则表示正数,最高位为1则表示负数。这样可以表示范围为-127~+127(1111 1111 ~ 0111 1111)一共能够表达 127*2+1=255个数字。这里包括127个负数,127个正数,还有一个0,比方案1少了一个数字,因为1000 0000 和 0000 000 都表示 0 ,虽然二进制形式不同,但是实际表示同一个数字。
方案3:因为方案2重复表示了0,所以本方案使用1000 0000 表示-128而不是负0,那么其他负数呢?以-127为例,-127 = -128+1。
-127 使用 1000 0000 + 1 = 1000 0001(方案2表示为1111 1111),在本方案中 1000 0000 + 0111 1111 = 1111 1111 表示 -128 + 127 = -1,因此 1111 1111 表示 -1。这种方案连续的表示了 -128~127这256个数字,其实就是补码的表示方法,当然补码最大的好处可以统一加减法。这里只介绍补码的表示意义。
leetcode 137题使用移位解法时,考虑到 当只出现 一次的数字是 负数时,需要考虑负数补码的含义。
网友评论