【问题标题】:Converting Pascal's "shr" to C's ">>"将 Pascal 的“shr”转换为 C 的“>>”
【发布时间】:2014-06-22 01:38:49
【问题描述】:

我在将一些 Pascal 代码翻译成 C 语言时遇到问题。基本上,我有嵌套循环,其中循环递增“k”在递增循环“i”内。在这两种情况下,我都想执行命令“如果 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>>k”值的文件。这些文件的前几行分别是:

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

“i>>k”的我的 C 结果是:

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

我还发现,在 Pascal 版本中,对于 i 的给定值,对“if”语句内部的访问次数更多。知道这里发生了什么吗?我知道 Pascal 的“shr”是逻辑移位,而 C 的“>>”是算术移位,但我认为将 (unsigned int) 类型转换放在“>>”的左操作数前面会解决这个问题吗?有人对如何使我的 C 语句等效于 Pascal 语句有任何建议吗?将不胜感激!

感谢阅读!

【问题讨论】:

  • 一开始就可以将 i 转换为 uint,为什么还要进行从 int i 到 unsigned int i 的类型转换?
  • 提示:&amp;&amp; 是一个逻辑 and 操作。 &amp; 是 按位 and。
  • 是的,我看到了,但是由于 Pascal 的“and”是逻辑运算符,那么我不想在 C 中使用“&&”吗?而且我知道我喜欢这样打字很愚蠢,所以我现在就继续改变它......谢谢:)
  • 您错过了 Pascal 中的 and 既是逻辑运算符又是位运算符的观点
  • 我在 i>>k 测试中没有看到相同的打印,我不确定您是如何从 i>>k 生成 1,2,1,3...。跨度>

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


【解决方案1】:

您的问题似乎与运算符优先级有关。

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

((i shr k) and 1)=1

在 C 版本中,您的条件是这样的(添加了一些括号以显示优先级):

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

另外,&amp;&amp; 是逻辑运算符,而不是位运算符。等效的位运算符是&amp;。如果你添加一些括号和切换运算符,你应该得到你想要的:

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

【讨论】:

  • +1 表示 operator precedence 的差异
  • 当然,== 1 也不是必需的。
  • 不,但这很常见,因为出于风格原因,很多人更喜欢将布尔值显式而不是隐式转换为布尔值。
  • 感谢您的提示!说得通。代码仍然无法正常工作,与我的 Pascal 代码相比,有没有办法确认此代码给了我想要的结果?使用上面相同的标准,当我在循环中评估“i>>k”时,我得到“1 1 3 1 1 5 1 3 1 7”
  • P 多少钱?如果你移动了 i 的宽度,那么结果是未定义的 msdn.microsoft.com/en-us/library/f96c63ed.aspx 另一个可能的原因可能是类型大小的差异,如果 Pascal 代码来自古代 DOS,那么整数是 2 个字节,而在大多数现代 PC 操作系统中它是 4 个字节。因为我对你的代码一无所知,所以无法做出更多假设
猜你喜欢
  • 2015-10-14
  • 2016-04-22
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2021-02-11
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多