对于整数有四种表示方式:
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;
在C课堂上学过,不做笔记了
同二进制,各位数的8^(位数-1)x 数,如0574 = 4 x 8^0 + 7 x 8 ^ 1 + 5 x 8 ^ 2 = 4 + 56 + 280 = 340
同二进制的计算,各位数的 16 ^ (位数 - 1 ) x 数,如0x23A = 16 ^ (1-1) x 10 + 16 ^ (2-1)x 3 + 16^ (3-1) x 2 =10+16x3+16x16x2=570
规则,将该数不断的除以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
规则同二进制转十进制一样,131转换为八进制,131 / 8 = 16 …… 3 ; 16 / 8 = 2 …… 0
2 / 8 = 0 …… 2 ;所以为0203
规则同上,237转为十六进制,237 / 16 = 14 ……13;14 / 16 = 0 …… 14 ;接着转换为对应的十六进制字母,13为D,14为E,即结果为0XED,
规则,从低位开始,将二进制数每三位一组(因为111为7,直接三位一组即可),转成对应的八进制数即可,将0b11010101转成八进制,0b 11(3) 010(2) 101(5) = 0325
规则,从低位开始,将二进制数的每四位一组(因为1111为15,直接四位一组即可),转成对应的十六进制数即可,将0b11010101转成16进制, 0b 1101(13) 0101(5) = 0XD5
规则,每一位八进制数转成对应的一个三位二进制数即可,0(000) 2(010) 3(011) 7(111) = 0b 1001 1111
规则,每一位十六进制转成四位的一个二进制数即可,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,否则为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
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)练习
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