一、先得讲讲二进制
9 + 1 = 10
0 + 1 = 1
1 + 1 = 10
10 + 1 = 11
11 + 1 = 100
100 + 1 = 101
101 + 1 = 110
二、难缠的符号
bin(0) 0b1 bin(2) 0b10 bin(3) 0b11
1. 难缠的符号之一 >>(二进制 - 右移) << (二进制 - 左移)
3 >> 1 1 8 >> 1 4
左移运算
1 << 1 2 1 << 2 4 1 << 3 8
左位移运算 a << N 结果是 a * (2**N)
2. 难缠的符号之二 & (按位与)
比较两个数字的二进制同一位,如果同一个位置的值都是1,则返回的值是1,否则为0
例1
>>> 10 & 20 0 >>> bin(10) '0b1010' >>> bin(20) '0b10100'
1010
10100
比较时候,不足的位补0,如果同一个位置都是1,那么结果是1,否则就是0
01010
10100
00000
例二
>>> 40 & 32 32 >>> bin(40) '0b101000' >>> bin(32) '0b100000'
101000
100000
100000 所以结果为 32
int(0b100000)
3. 难缠的符号之三 | (按位或)
比较两个数字的二进制同一位,同一个位置只要有一个是1,则返回的值是1,否则为0
>>> 32 | 100 100 >>> bin(32) '0b100000' >>> bin(100) '0b1100100'
0100000
1100100
1100100
4. 难缠的符号之四 ^ (按位异或)
参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
5. 难缠的符号之五 ~
参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;
三、其他
1. &基偶的判定
a & 1 结果为0 则是偶数 否则为奇数(原理:奇数的最后一位一定是1) 这个算法的速度更快.
2. 计算机容量
一个文件 11866字节 转换成M 11866 << 10
3. 真真假假不知晓
>>> True & False False >>> True & True True >>> False & False False >>> True & True & True True >>> True & True & False False >>> False & True & False False
四、回头看看这道题
aa = [(x*(x/2)>>0, x*(x%2)) for x in xrange(4)] print [((x>>1)<<1, (x&1)<<1) for x in xrange(4)]