我已经得到了一个提示,以下代码将起作用,但它确实如此,但我在一个小小的研究项目中使用它,需要彻底了解它背后的原理究竟是什么。
for i:=0 to (PNum-1) do begin
for j:=0 to (SMax-1) do begin
write(f, ((i shr j) and 1));
end;
writeln(f);
end;
基本上,它生成包含0和1的SMax符号长字符串的所有PNum变体。我的问题是,((i shr j) and 1)
(shr在Pascal中是正确的位移)是做什么的?
提前谢谢。
答案 0 :(得分:1)
表达式
((i shr j) and 1)
从“i”的二进制表示中提取j
位(从右边的零开始计数)。
示例:
i = 23; j = 3;
bin[23] = 10111
bin[23 shr 3] = 10111 shr 3 = 10
bin[23 shr 3] and 1 = 10 and 1 = 0
注意:如果[0,1]
而非所有排列,则算法会构建PNum = 2^SMax
的所有组合。