什么是进制
进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制—X进制,就表示每一位上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
所以说运算的本质是什么呢?我觉得是查数。打破固有的思想,我们把每个数字都看成是符号,这样就有意思多了,我们可以写出自己的进制,可以做自己的运算
进制转换
1、其他进制转十进制
从最低位开始,将每个位上的数提取出来,乘以进制的(位数-1)次方,求和
// 2^n 二进制为:1{n个0} 2^n-1 二进制为:{n个1}
二进制转十进制: 1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 11
八进制转十进制: 0123 = 3*8^0 + 2*8^1 + 1*8^2 = 83
十六进制转十进制: 0x34A = 10*16^0 + 4*16^1 + 3*16^2 = 786
2、十进制转其他进制
将该数不断除以要转换的进制,知道商为0为止,然后将得到的余数倒过来
十进制转二进制: 56 = 2^5 + 2^4 + 2^3 = 111000
十进制转八进制: 156 = 0234
十进制转十六进制: 256 = 0x164
3、二进制转其他进制
将二进制数每三位一组(从低位开始组合),转成对应的八进制 十六进制时四位
二进制转八进制: 11 010 101 = 0325
二进制转十六进制: 1101 0101 = 0xD5
4、其他进制转二进制
将八进制/十六进制每一位转换成对应的一个3/4位的二进制数即可
八进制转换成二进制: 0123 = 0 001 010 011 = 1010011
十六进制转换成二进制: 0x156 = 0001 0101 0110 = 101010110
原码、反码、补码
- 对于有符号数而言:
- 二进制的最高位是有符号位:0表示正数,1为负数
- 正数的原码、反码、补码都一样
- 0的反码、补码都是0
- 负数的反码 = 它的原码符号位不变,其他位取反
- 负数的补码 = 它的反码+1
- 计算机运算的时候,都是以补码的方式运算的
1 -1
原码 0000 0001 原码 1000 0001
反码 0000 0001 反码 1111 1110
补码 0000 0001 补码 1111 1111
位运算符
运算符 | 描述 | 规则 |
---|---|---|
& | 按位与 | 同时为1,结果为1,否则为0 |
| | 按位或 | 有一个为1,结果为1,否则为0 |
^ | 按位异或 | 当结果不同时结果为1,否则为0 |
<< | 左移 | 左移N位就是乘以2的N次方 |
>> | 左移 | 右移N位就是除以2的N次方 |
位运算本质
只要是运算,都是补码!!!运算结束需要转换成源码
// 2补码 3补码
2 & 3 = 0000 0010 & 0000 0011 = 0000 0010 = 2
2 | 3 = 0000 0010 | 0000 0011 = 0000 0011 = 3
2 ^ 3 = 0000 0010 ^ 0000 0011 = 0000 0001 = 1
// -2补码 3补码 结果(补码) -> 推出原码
-2 & 3 = 1111 1110 & 0000 0011 = 0000010 = 2
// 位移运算符 箭头朝向哪就是向哪个方向移
// 右移:低位溢出符号位不变,并用符号位补溢出的高位
// 左移:符号位不变,低位补0
// 左移n位 = 原值 * 2^n 右移n位 = 原值 / 4
1 >> 2 = 0
1 << 2 = 0000 0100 = 4
至此,位运算已经说明完毕。我们可以发现位运算的作用真的就只是在做标记而已,是名副其实的按位运算。