Pearls对编程问题2提出了这个问题。我无法理解其解决方案。
这是书中写的解决方案。
cat somefile | tr -d '\n'
我已经在我的编译器中运行了这个,我已经查看了另一个讨论这个问题的问题,但我仍然不明白这个解决方案的工作原理。
为什么要进行[i>> SHIFT]?为什么它只是一个[i] = 1;为什么我需要向右移动5次?
答案 0 :(得分:3)
32是2 5 ,所以5位右移相当于除以32.所以通过a[i>>5]
,你将i
除以32弄清楚数组的哪个元素包含位i
- 每个元素有32位。
同时& MASK
相当于mod 32,因此1<<(i & MASK)
为单词中的特定位构建1位掩码。
答案 1 :(得分:1)
将int i的32位(从位0开始到位31)分成两部分。
由于[]中的每个int都是32位,因此它可以跟踪那些32位的32个int。我们将每个输入i除以32以在[]中找到应该跟踪这个i的int。
每次将数字除以2时,它实际上是右移一次。要将数字除以32,您只需将其右移5次即可。这正是我们通过过滤掉第一部分得到的。
如何获得第一部分?右移i乘以5(即i&gt;&gt; SHIFT)。
如何获得第二部分?按11111对i进行按位AND。(11111) 2 = 0x1F,定义为MASK。所以,我和我MASK将给出由i的最后5位表示的整数值。
最后5位告诉你在[]中的数字内有多少位。例如,如果i为5,则要设置[]的索引0中的位,并且您特别希望将int值的5 th 位设置为[0]。
指数设置= 5/32 =(0101>> 5)= 0000 = 0.
在[0]
中设置= 5 th 位的位设置给定i的位
1
总共i%32次向左推,即1&lt;&lt;&lt; (i&amp; 0x1F)获取/测试给定i的位
清除给定i的位:表示将i的位设置为0。