今天开始学习java,开始的时候有些关于二进制的计算,想想以前学C的时候也没学好,就仔细学习了一下,分享出来,如有错误,欢迎指正。
1.源码 反码 补码
拿2个字节的int数据+7来算
源码:00000000 00000111
反码:00000000 00000111
补码:00000000 00000111
说明:正数的源码反码补码都是一样的,红色字体标记的0代表正数。
拿2个字节的int数据-7来算
源码:10000000 00000111
反码:11111111 11111000
补码:11111111 11111001
说明:负数的反码(除了标记正负的数字)是源码的相反,补码是反码+1,红色标记的1代表负数.
计算中数字储存以补码形式存储的。
2.~ 0/1取反
取反是二进制取反
就拿+7来说
补码:00000000 00000111
取反:11111111 11111000
显然这个补码是个负数,那么我们逆推回源码
反码:11111111 11110111
源码:10000000 00001000
那么7取反就是-8
那么来-11来说
补码:11111111 11110101
取反:00000000 00001010
显然这是个正数,源码==反码,为10
3.&按位与
&的计算规则为 二进制1&1取1,其他取0
比如7&11:
补码:00000000 00000111
补码:00000000 00001011
补码:00000000 00000011 =3
比如-7&11
补码:11111111 11111001
补码:00000000 00001011
补码:00000000 00001001 =9
比如-7与-11
补码:11111111 11111001
补码:11111111 11110101
补码:11111111 11110001
源码:10000000 00001111 =-15
4.|按位或
规则:二进制数字0|0取0,其他取1
比如7|11
补码:00000000 00000111
补码:00000000 00001011
补码:00000000 00001111 =15
比如-7|11
补码:11111111 11111001
补码:00000000 00001011
补码:11111111 11111011 =-5
5.>>右移制定位数
规则a>>b,把a的二进制数字右移b位,超过丢出,左边一般填0
比如:11>>2
补码:00000000 00001011
补码:00000000 00000010 =2
6.<<左移制定位数
比如:11<<2
补码:00000000 00001011
补码:00000000 00101100 =44
7.^按位或异
规则:1^0取1
比如:11^7
补码:00000000 00001011
补码:00000000 00000111
补码:00000000 00001100 =12
比如:-11^7
补码:11111111 11110101
补码:00000000 00000111
补码:11111111 11110010
源码:10000000 00001110 =-14