【问题标题】:bit shifting in CC中的位移
【发布时间】:2010-10-14 00:17:35
【问题描述】:
int x = 2;

x = rotateInt('L', x, 1); // should return 4

x = rotateInt('R', x, 3); // should return 64

这是代码,有人可以检查一下并告诉我错误是什么吗?

编译成功,但执行时却显示Segmentation Fault

int rotateInt(char direction, unsigned int x, int y)
{
  int i;

  for(i = 0; i < y; i++)
  {  

    if(direction == 'R')
    {
       if((x & 1) == 1)
       {
         x = x >> 1;
         x = (x ^ 128);     
       }
       else    
         x = x >> 1;
     }
     else if(direction == 'L')
     {
       if((x & 128) == 1)  
       {
         x = x << 1;
         x = (x ^ 1);     
       }  
       else
       x = x << 1;
     }
   }
   return x;   
 }

【问题讨论】:

标签: c bit-manipulation shift


【解决方案1】:

现在就开始磨练您的调试技能。如果您要成为任何形式的工程师,您将需要编写各种各样的程序,从而终生调试。

开始调试的一种简单方法是放入打印语句,以查看您的代码在它死前能走多远。我建议您从隔离错误开始。

【讨论】:

  • 它只打印分段错误,就是这样。
  • 在你的第一个 print 声明之前它已经崩溃了。提前移动打印语句并重试。重复直到你知道哪一行导致了段错误
  • @Josh 这正是我要说的,谢谢。不要忘记在你的 printf 语句中添加一个 \n 来刷新流。
  • 要获得奖励积分,请了解如何使用调试器。您通常会比使用 printfs 更快地发现问题。
  • @bstpierre 是的,但我认为如果我们还没有发现 printf-debugging,我们还没有为调试器的概念做好准备:)
【解决方案2】:

不确定段错误,但我认为

if((x & 128) == 1)  

应该是

if((x & 128) == 128)

或者只是

if(x & 128)  

【讨论】:

    【解决方案3】:

    我在我的电脑 (MacBookPro / Core2Duo) 上试过,它工作正常。 顺便问一下,你的目标架构是什么?当您使用 C 运算符“>>”和“

    【讨论】:

    • 好的,所以我认为它是一台英特尔机器,它不会旋转(至少它不是英特尔 Core2Duo 的情况)。但是,在整数旋转的情况下,它会用 0xff 掩盖参数(即“0xff00 >> 16 = 0”但“0xff00 >> 40 = 0xff”)。
    • &lt;&lt;&gt;&gt; 运算符执行实际位旋转而不是纯移位的编译器将不符合要求。我在运算符的定义中看不到任何回旋余地。它们是轮换而不是轮换,从语言诞生之日起就一直如此。请参阅 C99,第 6.5.7 节,其中说“E1 &lt;&lt; E2 的结果是E1 左移E2 位位置;空出的位用零填充。”它继续详细描述已定义行为的边界。右移的描述类似,但边界略有不同。
    • 这不是编译器的问题,而是处理器的问题。例如 PowerPC 的 shift 指令进行旋转。
    • @Antoine,移位多于整数类型的位数是明确的未定义行为。任何事情都有可能发生。编译器没有义务“合理”或生成执行“合理”事情的代码。
    • @Antoine,作为 非常清晰。它接着说E1&lt;&lt;E2 相当于乘以 2 的幂,只要值在界限内。同样清楚的是,移位零或负数是 UB,移位超过整数类型的位也是如此。
    【解决方案4】:

    当您使用 ^ 时,您的意思不是指 or 运算符 | 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多