关于random.sample与位运算sum生成大值及二进制串的技术疑问
问题解析
一、sum(1<<i for i in ...)生成大数值的原因
首先明确1 << i的含义:这是二进制左移运算,把数字1的二进制位向左移动i位,等价于计算数学上的2^i(2的i次方)。
以你例子里的i=6、26、38为例:
1 << 6=2^6= 641 << 26=2^26= 671088641 << 38=2^38= 274877906944
将这三个数相加:64 + 67108864 + 274877906944 = 274945015872,就是你看到的test_num数值。
这个数之所以大,是因为2的幂次增长极快:210是1024,220突破百万,230超过10亿,238直接达到2700多亿,相加后自然是个庞大的数。
二、39位二进制串的生成原理
代码里的f"{test_num:039b}"是Python的字符串格式化语法,各部分作用:
:b:将整数转换为二进制字符串039:如果二进制串长度不足39位,在前面补前导零,强制让总长度为39位
结合你的例子,test_num是2^6 + 2^26 + 2^38,对应的二进制就是在第39位(从右往左数,从0开始计数则是第38位)、第27位(26+1)、第7位(6+1)的位置为1,其余位为0。由于1<<38的二进制是1后面跟38个0,刚好是39位,用039b格式化后,就会得到你看到的100000000000100000000000000000001000000——三个1分别对应38、26、6的位置,其余补零凑够39位。
另外提一句:代码里的print(print(f"{test_num:039b}"))会输出两次内容——先打印二进制串,再打印内层print的返回值None,这是个小失误,改成print(f"{test_num:039b}")即可。
内容的提问来源于stack exchange,提问作者user20184312
相关产品推荐
相关产品推荐

