1、怎么判断一个存储在计算机中的二进制是正数还是负数
参考:https://jingyan.baidu.com/article/fedf0737b29e7535ad89775d.html
要清楚是以有符号进行存储还是无符号进行存储。
(1)、 如果是无符号存储,则其为一个正数。
(2)、若是有符号存储,则为补码存储。
(补码存储)需要看其最高位,最高位为0,为正数; 反之,为负数。
(3)、 如果仅仅是给了一堆二进制:比如10101010,那么它是没有正负概念的。
或者说10101010是原码或者补码,进而推断它的原始的值。
2、原码、反码、补码
参考:负数的二进制表示_storm_fury-CSDN博客_负数的二进制表示
计算机中存储数据都是以补码存储的
正数的原码、反码、补码一样
负数的补码为对该数的原码取反,然后在最后一位加1
(1)、原码:
一个正数的原码,是按照绝对值大小转换成的二进制数;
一个负数的原码,是按照绝对值大小转换成的二进制数,然后最高位补1。
比如 :
00000000 00000000 00000000 00000101是 5的 原码。
10000000 00000000 00000000 00000101是 -5的 原码。
(2)、反码:
正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
比如:
正数00000000 00000000 00000000 00000101的反码还是00000000 00000000 00000000 00000101
负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。
(3)、补码:
正数的补码与原码相同;
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
比如:
10000000 00000000 00000000 00000101的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
3、二进制的操作
与、或、异或、左移、右移
在不溢出的情况下
左移n位后的值 等于原值乘以2的n次方
例如 4 <<2 就是16,二进制就是 00000100 <<00010000
-4<<2 就是-16 二进制就是 11111100(负数在计算机中是以补码存在的) <<11110000,其中11110000是补码,想要知道它是多少需要先减一再取反(除符号位),减一是11101111,取反是10010000,所以是-16。
右移n位后的值 等于原值除以2的n次方的商
例如 4 >>2 就是1,二进制就是 00000100 >>00000001
-4>>2 就是-1 二进制就是 11111100 <<11111111,减一是11111110,取反是10000001,所以是-1。
4、编程题:
(1)、剑指offer面试题10:一个整数的二进制中1的个数:将整数的二进制表达的数每一位和1进行&运算,然后为例避免负数右移都是1的死循环情况,将1这个数字左移循环进行&运算。
(2)、剑指offer面试题40:数组中只出现一次的数字:
(3)、10进制转3进制: