进制
进制
二进制:0,1 ,满 2 进 1,以 0b 或 0B 开头。
十进制:0-9 ,满 10 进 1。
八进制:0-7 ,满 8 进 1, 以数字 0 开头表示。
十六进制:0-9 及 A(10)-F(15),满 16 进 1,以 0x 或 0X 开头表示。此处的 A-F 不区分大小写。
二进制转十进制
从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,
然后求和。
0b 1 0 1 1=1*2的(1-1)次方+1*2的(2-1)次方+0*2的(3-1)次方+1*2的(4-1)次方法
=1+2+0+8=11
八进制转十进制
从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方
然后求和。
02 3 4=4*80+3*81+2*82
=4+24+128=156
十六进制转换成十进制
从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
0x2 3 A=10*160+3*161+2*162
=10+48+512=570
十进制转换成二进制
将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
34=>0B00100010;
34/2= 商为17 余数为0;
17/2= 商为8 余数为1;
8/2= 商为4 余数为0;
4/2= 商为2 余数为0;
2/2= 商为1 余数为0;
1/2= 商为0 余数为1;
二进制:0B00100010
十进制转换成八进制
将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。
132=>0204;
132/8= 商为16 余数为4;
16/8= 商为2 余数为0;
2/8= 商为0 余数为2;
八进制:0204
十进制转换成十六进制
将该数不断除以 16,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的十六进制。
237 => 0xED;
237/16 商为14 余数为13;
14/16 商为0 余数为14;
十六进制:0xED
二进制转换成八进制
从低位开始,将二进制数每三位(2^3=8)一组,转成对应的八进制数即可。
0b 11(3) 010(2) 101(5) => 0325
二进制转换成十六进制
从低位开始,将二进制数每四位(2^4=16)一组,转成对应的十六进制数即可。
0b 1101(D) 0101(5) => 0xD5
八进制转换成二进制
将八进制数每 1 位,转成对应的一个 3 位的二进制数即可。
0 2(010) 3(011) 7(111) => 0b10011111
十六进制转换成二进制
将十六进制数每 1 位,转成对应的 4 位的一个二进制数即可。
0x 2(0010) 3(0011) B(1011) = 0b001000111011
原码、反码、补码
1.二进制的最高位是符号位:0表示正数1表示负数(老韩口诀:0->0,1->-)
2.正数的原码,反码,补码都一样(三码合一)
3.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
4.负数的补码=它的反码+1,负数的反码=负数的补码-1
5.0的反码,补码都是0
6.Java没有无符号数,换言之,Java中的数都是有符号的
7.在计算机运算的时以补码的方式来运算的
8.当我们看运算结果的时候,要看他的原码(重点)
位运算符
按位与&: 两位全为1,结果为1,否则为0
按位或 |: 两位有一个为1,结果为1,否则为0
按位异或^:两位一个为0,一个为1,结果为1
两位一个为0,一个为1,结果为1,否则为0
按位取反~:0->1,1->0
算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移 <<: 符号位不变,低位补 0
Example:
//结果=1
System.out.println(~-2);
思路:首先因为在计算机运算的时以补码的方式来运算的
第一步先找到-2的原码
第二步然后找到-2的反码
第三步根据反码获取到-2的补码
第四步根据取反操作得到~-2的值
根据口诀二进制的最高位是符号位 0表示正数1表示负数 int类型4个字节 一个字节8个二进制位
第一步:-2的原码:1 0000000 00000000 00000000 00000010
根据负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
第二步:-2的反码:1 1111111 11111111 11111111 111111 0 1
根据负数的补码=它的反码+1,负数的反码=负数的补码-1
第三步:-2的补码:1 1111111 11111111 11111111 111111 1 0 (1+1=2 0010)
按位取反~:0->1,1->0
第四步:~-2= 0 0000000 00000000 00000000 000000 0 1 (十进制=1)
//结果=2
System.out.println(2&3);
思路:首先因为在计算机运算的时以补码的方式来运算的
第一步先找到2的原码
2的原码 00000000 00000000 00000000 00000010
第二步然后找到2的补码(三码合一)
2的补码 00000000 00000000 00000000 00000010
第三步找到3的原码和补码
3的原码 00000000 00000000 00000000 00000011
3的补码 00000000 00000000 00000000 00000011
第四步按照按位&两位全为1,结果为1,否则为0计算结果
2:00000000 00000000 00000000 00000010
3:00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000010 (十进制=2)
//结果=-3
System.out.println(~2);
第一步先找到2的原码,补码(三码合一)
2的补码:00000000 00000000 00000000 00000010
第二步~2运算 按位取反~:0->1,1->0
~2:11111111 11111111 11111111 11111101
第三步运算结果的时候,要看他的原码(重点) 所以先把转码转换为反码
符号位1为负数 负数的反码=负数的补码-1
反码:1 1111111 11111111 11111111 11111100
第四步获取运算的原码 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
原码:1 0000000 00000000 00000000 00000011 (十进制=-3)

浙公网安备 33010602011771号