原码 补码 反码

发布时间 2023-12-14 10:33:22作者: 朝阳1
进制转换
二进制	八进制	十进制	十六进制
0000	    0	    0	    0
0001	    1	    1	    1
0010	    2	    2	    2
0011	    3	    3	    3
0100	    4	    4	    4
0101	    5	    5	    5
0110	    6	    6	    6
0111	    7	    7	    7
1000	    10	    8	    8
1001	    11	    9	    9
1010	    12	    10	    A
1011	    13	    11	    B
1100	    14	    12	    C
1101	    15	    13	    D
1110	    16	    14	    E
1111	    17	    15	    F
按位与&,按位或|,按位异或^,按位非~。他们的运算规则
&  两位都是1,结果位1,否则为0
|  两位有一个1,结果为1,否则为0
^  两位一个为0,一个为1,结果为1,否则为0
   异或的运算特点为:如果 a^b=c,那么就有 c^b=a 以及 c^a=b 
~ 将二进制中的0变成1,1变成0   
原码,补码,反码
1) 二进制的最高位是符号位,0表示正数,1表示负数
   1==》 0000 0001
  -1==》 1000 0001
2)正数的原码,反码,补码都一样
3)负数的反码,符号位不变,其他位取反
4)负数的补码等于反码+1
  1=》原码 0000 0001 反码 0000 0001 补码 0000 0001
 -1=》原码 1000 0001 反码 1111 1110 补码 1111 1111
5)0的补码,反码都是0
6)在计算机计算的时候,都是以数字的补码形式进行计算的
左移运算符 <<
实际上,左移一位就是乘以2,也就是乘以2的n次方
例如 9<<4
9的二进制(前面省略一串 0000 )
0000 0000 0000 1001
左移4位就是把二进制数左移4位
0000 0000 1001 0000
即为十进制的144
右移运算符 >>
右移n位,相当于除以2的n次方,并且往小里取整(正数(1.1就取1)负数(-1.1就取-2))
0左移,右移都是0
>> :右移 最高位是0,左边补齐0;最高为是1,左边补齐1 (也就是区分正数,负数)
<<  :左移 左边最高位丢弃,右边补齐0
>>>:无符号右移 无论最高位是0还是1,左边补齐0

在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方

右移一位相当于除2,右移n位相当于除以2的n次方。

12>>1       结果:6    12/2^1
12>>2       结果:3    12/2^2

12<<1       结果 :24      12x2^1
12<<2       结果 :48    12x2^2
-25 >> 4 = -2  (-1点多,向下取就是-2)
-2  >> 4 = -1  (-0点多,向下取就是-1)
18  >> 4 = 1   (1点多,向下取就是1)
问题 -20 >>3 =-3 
负数的右移,就是补码高位补1,然后按位取反加1即可
-20的二进制为1001 0100 ,
在计算机中应用补码(按位取反并加1)表示为:1110 1100,
右移三位后为1111 1101,
再还原为原码:1000 0011.即-3.
16进制转10
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
十六进制转换成十进制:方法是:将其它进制按权位展开,然后各项相加,就得到相应的十进制数;这里讨论的是整数,从右边开始,每一位的权值分别是 16^0 16^1 16^2 .....
然后乘以对应的数值最后加起来就是啦。如
CDH=C*16^1+D*16^0=12*16+13*1=205
二进制	十进制	十六进制	缩写	可以显示的表示法	名称/意义
0000 0000	0	00	NUL	␀	空字符(Null)
0000 0001	1	01	SOH	␁	标题开始
0000 0010	2	02	STX	␂	本文开始
0000 0011	3	03	ETX	␃	本文结束
0000 0100	4	04	EOT	␄	传输结束
0000 0101	5	05	ENQ	␅	请求
0000 0110	6	06	ACK	␆	确认回应
0000 0111	7	07	BEL	␇	响铃
0000 1000	8	08	BS	␈	退格
0000 1001	9	09	HT	␉	水平定位符号
0000 1010	10	0A	LF	␊	换行键
0000 1011	11	0B	VT	␋	垂直定位符号
0000 1100	12	0C	FF	␌	换页键
0000 1101	13	0D	CR	␍	归位键
0000 1110	14	0E	SO	␎	取消变换(Shift out)
0000 1111	15	0F	SI	␏	启用变换(Shift in)
0001 0000	16	10	DLE	␐	跳出数据通讯
0001 0001	17	11	DC1	␑	设备控制一(XON 启用软件速度控制)
0001 0010	18	12	DC2	␒	设备控制二
0001 0011	19	13	DC3	␓	设备控制三(XOFF 停用软件速度控制)
0001 0100	20	14	DC4	␔	设备控制四
0001 0101	21	15	NAK	␕	确认失败回应
0001 0110	22	16	SYN	␖	同步用暂停
0001 0111	23	17	ETB	␗	区块传输结束
0001 1000	24	18	CAN	␘	取消
0001 1001	25	19	EM	␙	连接介质中断
0001 1010	26	1A	SUB	␚	替换
0001 1011	27	1B	ESC	␛	跳出
0001 1100	28	1C	FS	␜	文件分割符
0001 1101	29	1D	GS	␝	组群分隔符
0001 1110	30	1E	RS	␞	记录分隔符
0001 1111	31	1F	US	␟	单元分隔符
0111 1111	127	7F	DEL	␡	删除
二进制	十进制	十六进制	图形
0010 0000	32	20	(空格)(␠)
0010 0001	33	21	!
0010 0010	34	22	"
0010 0011	35	23	#
0010 0100	36	24	$
0010 0101	37	25	 %
0010 0110	38	26	&
0010 0111	39	27	'
0010 1000	40	28	(
0010 1001	41	29	)
0010 1010	42	2A	*
0010 1011	43	2B	+
0010 1100	44	2C	,
0010 1101	45	2D	-
0010 1110	46	2E	.
0010 1111	47	2F	/
0011 0000	48	30	0
0011 0001	49	31	1
0011 0010	50	32	2
0011 0011	51	33	3
0011 0100	52	34	4
0011 0101	53	35	5
0011 0110	54	36	6
0011 0111	55	37	7
0011 1000	56	38	8
0011 1001	57	39	9
0011 1010	58	3A	:
0011 1011	59	3B	;
0011 1100	60	3C	<
0011 1101	61	3D	=
0011 1110	62	3E	>
0011 1111	63	3F	?
 	
二进制	十进制	十六进制	图形
0100 0000	64	40	@
0100 0001	65	41	A
0100 0010	66	42	B
0100 0011	67	43	C
0100 0100	68	44	D
0100 0101	69	45	E
0100 0110	70	46	F
0100 0111	71	47	G
0100 1000	72	48	H
0100 1001	73	49	I
0100 1010	74	4A	J
0100 1011	75	4B	K
0100 1100	76	4C	L
0100 1101	77	4D	M
0100 1110	78	4E	N
0100 1111	79	4F	O
0101 0000	80	50	P
0101 0001	81	51	Q
0101 0010	82	52	R
0101 0011	83	53	S
0101 0100	84	54	T
0101 0101	85	55	U
0101 0110	86	56	V
0101 0111	87	57	W
0101 1000	88	58	X
0101 1001	89	59	Y
0101 1010	90	5A	Z
0101 1011	91	5B	[
0101 1100	92	5C	\
0101 1101	93	5D	]
0101 1110	94	5E	^
0101 1111	95	5F	_	 	
二进制	十进制	十六进制	图形
0110 0000	96	60	`
0110 0001	97	61	a
0110 0010	98	62	b
0110 0011	99	63	c
0110 0100	100	64	d
0110 0101	101	65	e
0110 0110	102	66	f
0110 0111	103	67	g
0110 1000	104	68	h
0110 1001	105	69	i
0110 1010	106	6A	j
0110 1011	107	6B	k
0110 1100	108	6C	l
0110 1101	109	6D	m
0110 1110	110	6E	n
0110 1111	111	6F	o
0111 0000	112	70	p
0111 0001	113	71	q
0111 0010	114	72	r
0111 0011	115	73	s
0111 0100	116	74	t
0111 0101	117	75	u
0111 0110	118	76	v
0111 0111	119	77	w
0111 1000	120	78	x
0111 1001	121	79	y
0111 1010	122	7A	z
0111 1011	123	7B	{
0111 1100	124	7C	|
0111 1101	125	7D	}
0111 1110	126	7E	~

进制的转换公式
二进制转换十进制
假设有一个二进制数 101100100,转换成10进制就是 356

1x2^2 + 1x2^5 + 1x2^6 + 1x2^8 = 356
八进制转换十进制
假设有一个8进制的1507,转换成十进制为839
那么就是
7x8^0 + 0x8^1 + 5x8^2 + 1x8^3 = 839
十六进制转换十进制
假设有一个十六进制的2AF5
那么计算就是
5x16^0 + Fx16^1 + Ax16^2 + 2x16^3 = 10997
如何快速的进行 2进制,10进制,16进制 的 相互转换

先记住二进制 的8421

首先我们来看一个二进制数:1111,它是多少呢?
你可能还要这样计算:1×2º+1×2¹+1×2²+1×2³=1×1+1×2+1×4+1×8=15。
我们必须直接记住1111每一位的权值,并且是从高位往低位记,:8、4、2、1。 即,最高位的权值为2³=8,然后依次是 2²=4,2¹=2,2º=1。

记住8 4 2 1,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。
接下来我们练习 通过 8421 的方式 进行 快速的计算 , 2,10,16进制的转换
1111 = 8 + 4 + 2 + 1 = 15 =F
1110 = 8 + 4 + 2 + 0 = 14= E
1101 = 8 + 4 + 0 + 1 = 13= D
1100 = 8 + 4 + 0 + 0 = 12 =C
1011 = 8 + 0 + 2 + 1 = 11= B
1010 = 8 + 0 + 2 + 0 = 10 =A
1001 = 8 + 0 + 0 + 1 =9 =9
……
0001 = 0 + 0 + 0 + 1 = 1= 1
0000 = 0 + 0 + 0 + 0 = 0= 0

二进制数要转换为十六进制

二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。
如(上行为二制数,下面为对应的十六进制):
1111 1101 , 1010 0101 , 1001 1011
F    D    , A    5    , 9     B

16进制数转换为二进制数

反过来,当我们看到 FD时,如何迅速将此16进制数转换为二进制数呢?
先转换F:
看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。
接着转换D
看到D,知道它是13,13如何用8421凑呢?应该是:8 + 4 + 1,即:1101。
所以,FD转换为二进制数,为:1111 1101

十进制数转换成2进制

由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。
比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:
被除数 计算过程 商 余数
1234   1234/16  77 2
77     77/16    4  13 (D)
4      4/16     0  4
结果16进制为:4D2
然后我们可直接写出4D2的二进制形式:
0100
1101
0010
其中对映关系为:
0100 – 4
1101 – D
0010 – 2

二进制数转换成10进制数

同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。
下面举例一个int类型的二进制数:

01101101	11100101	10101111	00011011
我们按四位一组转换为16进制:6D E5 AF 1B
十进制转十六进制
采余数定理分解,
例如将487710转成十六进制:

487710 ÷ 16 = 30481….14(E)
30481  ÷ 16 = 1905….1
1905   ÷ 16 = 119….1
119    ÷ 16 = 7….7
7      ÷ 16 = 0….7
这样就计到487710(10)=7711E(16)

2进制转成8进制

从右至左,每3个为一组,不足的补0,通过转换为十进制的方法把它们转换为数字
2进制原码             1010 0100
3位(不够的补0)      010 100 100
得到为  2   4   4 

8进制转成2进制

每一个数转化为3位的二进制数即可,不足的补0,再按顺序排列即可。
例如8进制的 244,三位分别转换
            2---》010
            4---》100
            4---》100
即为010100100