将Pascal的“shr”转换为C的“>>”

时间:2014-06-22 01:38:49

标签: c bit-manipulation pascal bit-shift shift

我在将一些Pascal代码转换为C时遇到了问题。基本上,我有嵌套循环,其中循环递增'k'在循环递增'i'内。在这两种情况下,我想执行命令“if i(右移)k AND 1 = 1,然后执行以下{code}”。在帕斯卡尔我有:

{Pascal Code}
...
for i:=0 to N-1 do begin j:=0; temp:=N/2;
for k:=0 to P-1 do begin if ((i shr k) and 1)=1 then...

我知道哪些有效。我已经从Pascal代码中绘制了数据并且它是正确的,所以我假设这个算法是我想用C复制的。在C中我有:

/*C code*/
...
int i;
unsigned int k;
for(i=0;i<N;i++){
   j=0;
   temp=N/2;
   for(k=0;k<P;k++){
      if((unsigned int)i)>>k&&1==1){
          /*do code*/
      }

在调试这些行时,我正在写文件,显示Pascal的“i shr k”和C的“i&gt;&gt; k”的值是什么。这些文件的前几行是:

Pascal's "i shr k":
0
0
0
0
0
0
0
0
0
1...

“i&gt;&gt; k”的我的C结果是:

C's "i>>k":
1
2
1
3
1
4
2
1
5
2...

我还发现在Pascal版本中,对于i的给定值,对“if”语句的内部有更多访问。关于这里发生了什么的任何想法?我知道Pascal的“shr”是一个合理的转变,C的“&gt;&gt;”是一个算术移位,但我认为将(unsigned int)类型转换放在“&gt;&gt;”左操作数的前面会修复吗?有人对如何使我的C语句等同于Pascal语句有任何建议吗?非常感谢!

感谢阅读!

1 个答案:

答案 0 :(得分:4)

您的问题似乎与操作员的准备有关。

在Pascal版本中,您的条件是:

((i shr k) and 1)=1

在C版本中,您的条件是这个(添加了一些括号以显示前置):

(i >> k) && (1==1)

此外,&&是逻辑运算符,而不是按位运算符。等效的按位运算符是&。如果你添加一些括号和开关操作符,你应该得到你想要的:

((i >> k ) & 1) == 1