【JAVA学习笔记】11 - 进制,二进制原码、补码、反码,位运算符号

一、进制的介绍

        对于整数有四种表示方式:

1.二进制:0,1,满2进1,以0b或者0B开头 //int n1 = 0b1010

2.十进制:0-9 //int n2 = 1010

3.八进制:0-7,满8进1,以数字0开头表示//int n3 = 01010

4.十六进制:0-9及A-F,满16进1,以0x或者0X开头表示,A-F不区分大小写//int n4 = 0x10110;

二、进制的转换

1.二进制转十进制

        在C课堂上学过,不做笔记了

2.八进制转十进制

        同二进制,各位数的8^(位数-1)x 数,如0574 = 4 x 8^0 + 7 x 8 ^ 1 + 5 x 8 ^ 2 = 4 + 56 + 280 = 340

3.十六进制转十进制

        同二进制的计算,各位数的 16 ^ (位数 - 1 ) x 数,如0x23A = 16 ^ (1-1) x 10 + 16 ^ (2-1)x 3 + 16^ (3-1) x 2 =10+16x3+16x16x2=570

4.十进制转二进制

        规则,将该数不断的除以2,直到商为0,然后将每步得到的余数倒过来,就是对应的二进制,如

 34转成二进制,34 / 2 =17 ……0;17 / 2 =8……1;8 / 2 = 4…… 0;4 / 2 = 2 …… 0;2 / 2 =1…… 0;1 / 2 =0 ……1 即 0b100010,在计算机内要补两个0,一个字节里有八位所以为0b00100010

5.十进制转八进制

        规则同二进制转十进制一样,131转换为八进制,131 / 8 = 16 …… 3 ; 16 / 8 = 2 …… 0

2 / 8 = 0 …… 2 ;所以为0203

6.十进制转十六进制

        规则同上,237转为十六进制,237 / 16 = 14 ……13;14 / 16 = 0 …… 14 ;接着转换为对应的十六进制字母,13为D,14为E,即结果为0XED,

7.二进制转八进制

        规则,从低位开始,将二进制数每三位一组(因为111为7,直接三位一组即可),转成对应的八进制数即可,将0b11010101转成八进制,0b 11(3) 010(2) 101(5) = 0325

8.二进制转十六进制

        规则,从低位开始,将二进制数的每四位一组(因为1111为15,直接四位一组即可),转成对应的十六进制数即可,将0b11010101转成16进制, 0b 1101(13) 0101(5) = 0XD5

9.八进制转二进制

        规则,每一位八进制数转成对应的一个三位二进制数即可,0(000) 2(010) 3(011) 7(111) = 0b 1001 1111

10.十六进制转二进制

        规则,每一位十六进制转成四位的一个二进制数即可,0X 3(0011) 2(0010) B(1011)

= 0b0011 0010 1011

三、原码、补码、反码

对于有符号的而言

1).二进制的最高位是符号位:0表示整数,1表示负数

2).正数的原码,反码,补码都一样

3).负数的反码=它的原码符号位不变,其他位取反

4).负数的补码=它的反码+1,负数的反码 = 负数的补码 - 1

5). 0的反码,补码都是0

6).java没有无符号数,换而言之,JAVA中的数都是有符号的

7).在计算机运算的时候,都是以补码的方式进行运算

8).当我们看运算结果的时候,要看他的原码

四、位运算符

        JAVA中有7个位运算(&、|、^、~、>>、<<、>>>)

1.按位符号

他们的运算规则是 

1) 按位与&:两位全为1,结果为1,否则为0

2)按位或| :两位有一位为1,结果为1,否则为0

3)按位异或 ^:两位不同,结果为1,否则为0

4)按位取反~ : 0变1,1变0

        分析 2 & 3 //第一步,先得到2的补码计算机才能计算,要得到补码又需要2的原码,因为是int型所以有四个字节 0000000 00000000 00000000 000000010,因为是正数,所以三码都是它本身,第二步得到3的补码 =>3的原码,同理 00000000 00000000 00000000 00000011,第三步,进行按位运算,两位同为1输出1,所以输出00000000 00000000 00000000 00000010 第四步,这是运算之后的补码,所以要转换为原码,补码符号位为0,正数三码都是一样的,所以运算完之后还是这个,也就是2

        ~-2 //第一步,得到-2的原码,10000000 00000000 00000000 00000010,第二步,得到补码,负数的反码+1为补码,而反码为符号位以外取反,11111111 11111111 11111111 11111101,在反码基础上+1得到补码,也就是11111111 11111111 11111111 11111110,接着第三步,按位取反,得到00000000 00000000 00000000 00000001,该补码为正数,所以三码相同,转为十进制得到结果为1

        ~2 //第一步,得到2的补码,正数三码相同,所以为00000000 00000000 00000000 00000010,按位取反11111111 11111111 11111111 11111101,得到取反后的补码,因为是负数,所以要进行转换,该数的反码为补码 - 1,即,11111111 11111111 11111111 11111100,在反码的基础上符号位以外取反转为原码,即 10000000 00000000 00000000 00000011 也就是-3

        2 | 3 = //同理 都为正数,不考虑符号位,三码相同,即 0010 | 0011,得到0011,也就是3

        2  ^ 3 = //同理,都为正数,不考虑符号位,三码相同,即 0010 ^ 0011得到0001,也就是1

2.算术位符号

1)算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位

2)算术座椅<<:符号位不变,低位补0

3)逻辑右移>>>:逻辑右移也叫无符号右移,运算规则是:把符号位也右移,低位溢出,高位补0

4)特别说明 没有 <<<

        例如 int a = 1>>2;//对应二进制 0000 0001 => 0000 0000 01 本质是1 / 2 / 2 = 0

        int c = 1<<2;//对应二进制 0000 0001 => 0000 0100 本质是1 * 2 * 2 = 4

        int b = 4<<3;//本质是4 * 2 * 2 * 2 = 32 ,对应二进制 0000 0100 => 0010 0000 =32

5)练习

                【JAVA学习笔记】11 - 进制,二进制原码、补码、反码,位运算符号_第1张图片 

		int a = 1>>2; //0001 => 0000 01  为0
		int b = -1<<2;//补码为11111111 11111111 11111111 11111111,左移后11111111...11111100
//反码为11111111...11111011,原码为10000000...00000100,结果为-4,本质是-1x2x2=-4
		int c = 1<<2;//0001 => 0100 为4
		int d = -1>>2;//同理,为0
		int e = 3>>>2;//同理,带符号位一起右移,为0

                ​​​​​​​ 

你可能感兴趣的:(学习,笔记,java)