进制:同一数字符号根据位置不同而具有不同的量。
用多位简单的数字来表示一个复杂的数字时,满足一定数量n时,
向前进位1,称为n进制。
简单来说就是满(逢)n进1。
数字的由来:
古人在生产劳动过程中,有计数的需求。比如:我有一群羊,我想知道我有多少只羊,可是这个羊总是跑来跑去,有时候这些羊出去吃草分散成一大片,就不能很方便的知道到底有多少。于是就通过摆放树枝,木棍的方式来计数,因为木棍不会跑动,一个木棍代表一只羊。
例如这个样子:
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
可是,羊少的时候还好说,羊多了的时候数的人头疼,而且不便于很直观的知道到底羊的数量处于哪一个数量级。
于是古人就开始分堆摆放,暂时满足了落后的农业生产需求。例如:
|||||||||| |||||||||| |||||||||| |
进制的由来:
后来部落与部落之间争抢地盘,打架,首领就要约估自已的族人数量,和羊的数量(咋又是羊呢?因为人要吃饭啊,现代打仗打的是钱,古代打仗打的是羊!),人太多,羊也太多,一只羊一只木棍,摆木棍摆的精疲力尽,需要的木棍数量也太多。那能不能用较少的木棍数量来表示较大的数字呢?
神奇的印度阿三人发明了这样的一种分堆摆放木棍方式(同一数字符号根据位置不同而具有不同的量):
1231只羊这样表示(10进制):
| || ||| |
这样的摆放方式将1000多只羊简化到只需要几根木棍就能统计完成。这样摆放的精髓就在于同一数字符号根据位置不同而具有不同的量,由此产生了最初的进制概念。
最初不是以10为进制的,本例当中把1231只羊表示为| || ||| | 仅仅是为了大家理解方便,因为大家对10进制熟悉。
后来,阿三又发明了用1表示|,2表示||,3表示|||,又进一步简少了木棍的数量。
再后来,由于阿三跟阿拉伯人皮,被征服了。阿拉伯人惊奇的发现印度阿三的计数方式竟然要先进于他们,于是阿拉伯人虚心的学习了阿三的计数方式,也将此计数方式带入了欧州,也由此走向全世界。欧州人误以为是阿拉伯人发明的,所以称为阿拉伯数字。
10进制:
10进制当中1的含义:
0 0 0 1 => 1 10^0 (10的0次方) 个(一)
0 0 1 0 => 10 10^1 (10的1次方) 十
0 1 0 0 => 100 10^2 (10的2次方) 百
1 0 0 0 => 1000 10^3 (10的3次方) 千
........
10000 0000 这是10的几次方?
123456789用10进制表示:
10^0*9 + 10^1*8 + 10^2*7 + 10^3*6 + 10^4*5 + 10^5*4 + 10^6*3 + 10^7*2 + 10^8*1
= 9 + 80 + 700 + 6000 + 50000 + 400000 + 3000000 + 20000000 + 100000000
= 123456789
2进制:
2进制当中1的含义:
0 0 0 0 1 => 1 2^0 (2的0次方) 个(一)
0 0 0 1 0 => 2 2^1 (2的1次方) 二
0 0 1 0 0 => 4 2^2 (2的2次方) 四
0 1 0 0 0 => 8 2^3 (2的3次方) 八
1 0 0 0 0 => 16 2^4 (2的4次方) 十六
........
10000 0000 这是2的几次方?
1用2进制表示(0001):
2^3*0 + 2^2*0 + 2^1*0 + 2^0
= 0 + 0 + 0 + 1
= 1
2用2进制表示(0010):
2^3*0 + 2^2*0 + 2^1*1 + 2^0*0
= 0 + 0 + 2 + 0
= 2
3用2进制表示(0011):
2^3*0 + 2^2*0 + 2^1*1 + 2^0*1
= 0 + 0 + 2 + 1
= 3
4用2进制表示(0100):
2^3*0 + 2^2*1 + 2^1*0 + 2^0*0
= 0 + 4 + 0 + 0
= 4
5用2进制表示(0101):
2^3*0 + 2^2*1 + 2^1*0 + 2^0*1
= 0 + 4 + 0 + 1
= 5
......
127用2进制表示(0111 1111)
0*2^7 + 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0
= 0 + 64 + 32 + 16 + 8 + 4 + 2 + 1
= 127
在定义变量时可以使用2进制表示方式:int i = 0b0000_1111;
8进制:
8进制当中1的含义:
0 0 0 0 1 => 1 8^0 (8的0次方)
0 0 0 1 0 => 8 8^1 (8的1次方)
0 0 1 0 0 => 64 8^2 (8的2次方)
0 1 0 0 0 => 512 8^3 (8的3次方)
1 0 0 0 0 => 4096 8^4 (8的4次方)
........
10000 0000 这是8的几次方?
用8进制表示1-9
1: 0000 0001
2: 0000 0002
3: 0000 0003
4: 0000 0004
5: 0000 0005
6: 0000 0006
7: 0000 0007
8: 0000 0010
9: 0000 0011
用8进制表示100
100:0000 0144
用8进制表示200
200:0310
用8进制表示600
600: 01130
在定义变量时可以使用8进制表示方式:int i = 01111;
16进制:
16进制当中1的含义:
0 0 0 0 1 => 1 16^0 (16的0次方)
0 0 0 1 0 => 16 16^1 (16的1次方)
0 0 1 0 0 => 256 16^2 (16的2次方)
0 1 0 0 0 => 4096 16^3 (16的3次方)
1 0 0 0 0 => 65536 16^4 (16的4次方)
........
10000 0000 这是16的几次方?
用16进制表示1-17
1: 0000 0001
2: 0000 0002
3: 0000 0003
4: 0000 0004
5: 0000 0005
6: 0000 0006
7: 0000 0007
8: 0000 0008
9: 0000 0009
10: 0000 000a
11: 0000 000b
12: 0000 000c
13: 0000 000d
14: 0000 000e
15: 0000 000f
16: 0000 0010
17: 0000 0011
18: 0000 0012
用16进制表示301
301: 012d
用16进制表示5000
5000:0000 1388
用16进制表示65535
65535: 0ffff
在定义变量时可以使用16进制表示方式:int i = 0x1111;
有符号类型(+,-)
首位为符号位,首位为0表示正数。首位为1表示负数。
无符号类型
所有的数都是正数,不包含负数。
char的最大值是多少?(char是无符号类型)
1111 1111 1111 1111 = 65535
负数的2进制转10制:
公式: 求补码(1.求反码 2.反码+1)
1000 0000 = -128
100 0000 = -64
1111 1111 = -1
byte: [-128,127]
0111 1111 最大值
10000 0000 最小值
short: 0000 0000 0000 0000 ?
int : 0000 0000 0000 0000 0000 0000 0000 0000 ?
位运算符:
与(&) 只有两个数位同时为1时,结果才是1
byte: 1 & 2
0000 0001
0000 0010
0000 0000
byte: 2 & 3
0000 0010
0000 0011
0000 0010
或(|) 只要有一个个数位是1,结果就是1
byte: 1 | 2
0000 0001
0000 0010
0000 0011
byte: 2 | 3
0000 0010
0000 0011
0000 0011
非(~) 1变0,0变1
~1
~0000 0001
1111 1110 = -2
~2
~0000 0010
1111 1101 = -3
~3
…
~-1
~1111 1111
00000000 = 0
异或(^) 两个数一模一样结果是0,不一样结果是1
1 ^ 2 = 3
0000 0001
0000 0010
0000 0011
左移(<<),右移(>>),无符号右移(>>>)
左移: 1 << 1 = 0
0000 0001
以最快的速度计算2 * 8 = ? -> 2 <<< 3
结论: 左移1次相当于乘于2
右移:1 >> 1 = 2 (原来的数是正值,在左边补0。原来的数是负值,在左边补1。)
结论: 右移1次相当于除于2
-4 >>> 1 = -2
无符号右移:(无符号右移永远在左边补0)
8 >>> 1 = 4