这个排列发生器如何工作?

时间:2012-01-08 10:37:27

标签: permutation pascal bit-shift

我已经得到了一个提示,以下代码将起作用,但它确实如此,但我在一个小小的研究项目中使用它,需要彻底了解它背后的原理究竟是什么。

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中是正确的位移)是做什么的?

提前谢谢。

1 个答案:

答案 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的所有组合