头疼的位运算
大学没学好也不能怪我,真的,况且我还盲羊补牢呐。。。
大学计算机基础
自问一个问题:32 bit 的 int 能容纳的整数个数共多少?最大的那一个整数的值是多少?
- 能容纳的整个个数:2*31 * 2。
- 最大的那一个整数的值:2^0 + 2^1 + … + 2^30(问题来了,等比数列求和怎么求 2333)
(进入正题
- 对于 32 bit 的 int 来说:1 用二进制表示即为
0 0(重复30次)1
,即总共 31 个 0 和 1 个 1 - 对于 32 bit 的 int 来说:-1 用二进制表示即为
1 1(重复 31 次)
,即总共 32 个 1(问题又来了,为啥哩?请看原码,补码等概念 2333,白学了 ?♀️)
使用下个这个程序进行相关测试
#include<stdio.h>
int main(){
int a, b;
a = (1 << 30) - 1 + (1 << 30) ;
b = -1;
printf("%d %d %d", a, b, a&b);
return a;
}
另外一个问题:计算机是怎样计算一个数的负数的?setbit 吗?(先不研究,应该是门电路之类的把)
还有一个问题:Python 是怎样计算的呢?参考资料一 其中的一个重要结论是 Python 的 int 是不定长的,不能通过类似 setbit 的操作将一个正数变成负数。
运用
判断一个数是 0 还是 1
if x ^ 0:
x == 1
else:
x == 0
怎样判断一个数用 2 进制表示时,最后一个 bit 是 0 还是 1?
if x & 1:
last_bit = 1
else:
last_bit = 0
不使用 + 号,将一个包含二进制数的列表转换为 10 进制
(不过这个操作并没有什么用的赶脚)
def get_num(l):
# l is a deque objct
s = 0b0
while True:
try:
n = l.popleft()
except IndexError:
break
s |= n
s <<= 1
s >>= 1
return s
延伸
计算机是什么判断 a>b 的?
类似问题:计算机判断 a>b 的时候是不是计算 a - b 的值,然后用它和 0 作比较得到的呢?
看样纸是通过硬件来实现了,不需要计算 a - b 的值。
Comments