进制
- 二进制:0-1,常以0b,0B开头
- 十进制,0-9
- 八进制,0-7,常以数字0开头
- 十六进制,0-9及A(10)-F(15),满16进一,以0x或0X开头
使用
二,八,十六进制转十进制,相乘相加;大转小用相除
十进制转二,八进制,十六进制,比如521=0B1000001001=01011=0x209
二转八,十六进制(反过来同理), 该二进制0b1(1) 000(0) 001(1) 001(1)=01011八进制
该二进制0b 10(2) 0000(0) 1001(9)=0x209十六进制
八,十六进制转二,该八进制0 1 (001) 0 (000) 1(001) 1(001) =0b1000001001 二进制
位运算
在Java中有七个位运算符 按位与&,按位或|,按位异或^ 按位取反~,<<、>>>
位运算符
-
按位与&:两位全是1,结果为1,否则为0
-
按位或|:其中一位是1,结果为1,否则为0
-
按位异或^:其中一位是1,另一个是0,结果为1,否则为0
-
按位取反~:0变1,1变0
-
算术右移 >> : 低位溢出,符号位不变,并用符号位补溢出的高位
-
算术左移<< : 符号位不变,低位补0
-
逻辑右移>>> : 也叫无符号右移,低位溢出,高位补0
-
特别注意 没有<<< 符号
原码、反码、补码
规则
- 二进制最高位是符号位:0表示正数,1表示负数
- 正数的原码、反码、补码都一样
- 0的反码、补码都是0
- 负数的反码= 原码符号位不变,其他位取反(1的反码就是0)
- 负数的补码=反码+1
- java没有无符号数,所以java的数都是有符号的
- 在计算机运算时,都是以补码的方式来运算。
- 运行结果看原码
int a = 1>>2;表示1向右位移两位
int b = -1<<2,表示-1向左位移两位
int c = 2>>>4,表示2算术位移4位
~2,表示按位取反操作
2&3,表示2按位与3
2|3,表示2按位或3
-3^5,表示-3按位异或5
推导 2 & 3
求出2按位与3的结果
为什么先要获取2和3的补码,因为计算机在运算时,是以补码运算的。
1.先得到2的补码。 又因为正数的原码=反码=补码,故先求出2的原码
因为2是int类型,有4个字节,
一字节八位得2的原码 00000000 00000000 00000000 00000010 ,
注意第一个0是代表符号位,为正数
2.得出3的补码。
00000000 00000000 00000000 00000011
3. 2按位与3结果 补码是 00000000 00000000 00000000 00000010
4.运算结果只看原码,将上面的补码转换成原码 00000000 00000000 00000000 00000010 ,转成十进制结果是2
System.out.println(2&3); 2
练习位运算
1. System.out.println(~-2);
分析:~是按位取反符号,-2是代表是负数。负数的补码=反码+1,反码就是 [符号位不变,原码0变1,1变0],已知原码求补码?
-2的原码是 10000000 00000000 00000000 00000010
-2的反码是 11111111 11111111 11111111 11111101
-2的补码是 11111111 11111111 11111111 11111110
按位取反~-2是 00000000 00000000 00000000 00000001
原码是 00000000 00000000 00000000 00000001
System.out.println(~-2); 1
2.System.out.println(~2);
分析 : ~按位取反 , 2是正数,符号位是0, 原码=补码=反码,因运算时,是以补码运算, 已知原码求补码?
2的原码是 00000000 00000000 00000000 00000010
2的补码是 00000000 00000000 00000000 00000010
按位取反~2 是 11111111 11111111 11111111 11111101
将 补码 11111111 11111111 11111111 11111101 转换为反码
反码是补码-1 11111111 11111111 11111111 11111100
原码是 10000000 00000000 00000000 00000011
System.out.println(~2); -3
3.System.out.println(2|3); 3
4.System.out.println(2^3); 1
-----------------------------------------------------------------------------------------
int a = 1>>2; 1算术右移2位
先求1的补码 00000000 00000000 00000000 00000001
右移两位 00000000 00000000 00000000 00000000 也表示 1/2/2,就像十进制百位上的数变成个位,除于他的进制10
1>>2 结果是 0
int b = 1<<2 ;1算术左移 2位
先求1的补码 00000000 00000000 00000000 00000001
左移两位 00000000 00000000 00000000 00000100 也表示 1*2*2,就像十进制个位上的数变成百位,乘于他的进制10
1<<2 结果是 4
4 << 3 = 4*2*2*2=132
15 >> 2 = 15/2/2=3