【发布时间】: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 的类型转换?
-
提示:
&&是一个逻辑and操作。&是 按位and。 -
是的,我看到了,但是由于 Pascal 的“and”是逻辑运算符,那么我不想在 C 中使用“&&”吗?而且我知道我喜欢这样打字很愚蠢,所以我现在就继续改变它......谢谢:)
-
您错过了 Pascal 中的
and既是逻辑运算符又是位运算符的观点 -
我在 i>>k 测试中没有看到相同的打印,我不确定您是如何从 i>>k 生成 1,2,1,3...。跨度>
标签: c bit-manipulation pascal bit-shift shift