第九节课:这些难缠的符号


一、先得讲讲二进制

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)]
原文地址:https://www.cnblogs.com/huiming/p/5538484.html