二进制的理解

1.位运算
二进制数只有0和1,如果用电路的逻辑开关来表示(0:关,1:开)

那么二进制的运算

&     -->    与门(串联电路)       -->    都为1才=1
|     -->    或门(并联电路)      -->     有一个1就=1

观察二进制的加法运算,
0+0=00
0+1=01
1+0=01
1+1=10

从运算结果来看,如果只剥离出第0位的计算结果,那么:
0+0=0
0+1=1
1+0=1
1+1=0
要实现这个逻辑的电路,还需要一个与非门的组件(就不贴图了)。
这个运算,称为异或:

^      -->      不同为1,相同为0

2.转换
理解一个根本问题:X进制每一位代表的是当前位(假设位数是n)的X^n-1的数量
比如:

十进制:263 = 2个100+6个10+3 = 2*10^2+6*10^1+3*10^0
二进制:1011 = 1个2^3+0个2^2+1个2^1+1 = 1*2^3+0*2^2+1*2^1+1*2^0
十六进制:2A = 2个16+A = 2*16^1+A*16^0

1位十六进制的数,可以表示16个数,16=2^4,也可以说每1位的十六进制需要4位二进制进行表示,因此可以这样理解:

0xF = 1111,
0xF1 = F*16+1=F*2^4+0001 = 1111 0001
0xF12 = F*16^2+1*16+1=F*2^8+1*2^4+0001 = 1111 0001 0010

结论:十六进制每一位代表一个四位的二进制,
因此对十六进制转二进制,可以很简单的把十六进制每一位进制拆分转为二进制后,再组合一起,
例如:

0x1E4F = 0001 1110 0100 1111

3.左移、右移
理解了“X进制的根本”之后,二进制的左移和右移就很好理解了(只谈无符号情况)
左移:
将一个数左移动N位,右边补0,这种情况,低位直接成高位,高出多少呢,假如移动1位,则这个数增大2倍,移动N位就是2^N倍。 所以左移的结果就是–>原始值*2^N
右移:
将一个数右移动N位,左边补0,这种情况,高位直接成低位,低出多少呢,假如移动1位,则这个数减小2倍,移动N位就是2^N倍。 所以右移的结果就是–>原始值/2^N

针对十六进制数的左移右移呢?
计算机只有二进制,编程中对十六进制的左右移其实也只是先转化为二进制再操作。
前面谈到了十六进制的每一位代表一个4位的二进制,那么是不是可以这样理解,每进行一次4位的左右移,相当于是对这个十六进制进行了1位的左右移呢? 例如:

0x5A << 4 = 0x5A0;
0x5A << 8 = 0x5A00;
0x5A >> 4 = 0x5;
0x5A >> 8 = 0x0;

4.一些位运算
理解了上述原理后,再来看一些运算操作,就很容易了。
例如:
针对一个二进制,想取高2位的值,可以:

第1步:1010 0101 & 1100 0000 = 1000 0000
第2步:1000 0000 >>6 = 10

针对一个十六进制,想取2-3位的值,可以:

第1步:0xABCDF & 0x0FF00 = 0xBC00
第2步:0xBC00 >>8 = 0xBC