进制介绍
注意:二进制加0b,八进制0开头,十六进制0x
十进制转二进制
注意:一个字节有8位,所以要加上两个00
十进制转十六进制
二进制转八进制
二进制转十六进制
八进制转二进制
十六进制转二进制
原码、反码、补码(重难点,要背)
tip:
一般都是: 原码->反码->补码 --开始运算-- 补码 ->反码->原码
位运算符
tip:左乘右除,移动的是二进制的补码,右移高位补符号位,左移低位补0
注意:左移和右移也是在补码的基础上进行的,左边是高位右边是低位
案例
2&3
~-2
~2
5>>2
首先是 5>>2 = 1
原码 0000 …… 0101
补码 0000 …… 0101
>>2(正数右移高位补0)
补码 0000 …… 0001
原码 0000 …… 0001
= 1
-5>>2
然后是 -5>>2 = -2
原码 1000 …… 0101
反码 1111 …… 1010 负数的反码是保留符号位不变源码取反
补码 1111 …… 1011 补码是反码加1
>>2 (负数右移高位补1)
补码 1111 …… 1110
反码 1111 …… 1101 补码转反码减1
源码 1000 … 0010 负数反码转源码保留符号位不变取反
= -2
无符号右移注意:在C语言中是没有“无符号右移”运算符的,在Java中用“>>>”表示,C语言中可以利用“((unsigned int)(-5))>>n”来实现无论是正数还是负数,其无符号右移都是在其补码的基础上右移,高位补0。
例如-5
原码 1000 …… 0101
反码 1111 …… 1010 负数的反码是保留符号位不变源码取反
补码 1111 …… 1011 补码是反码加1
>>>2(无符号右移,高位补0)
补码 0011 …… 1110
反码 (此时符号位已经变为0了,系统会当成正数来处理,原反补码均一样)
原码 0011 …… 1110
= 这个不好说,得看操作系统的位数(在我这里int为32位,
结果为:107374182==>00111111 11111111 11111111 11111110)
此博客主要为韩顺平老师java课程的笔记总结,详细内容可以去b站看韩老师的相关课程