【问题标题】:Representation of code (C)代码表示 (C)
【发布时间】:2017-10-28 18:57:02
【问题描述】:

请您帮忙重新编写这段代码。我无法理解按位左移实际上是如何工作的。如果有更简单的方法来表示此代码,请告诉我。

此代码用于计算数字的位表示中 1(一)的个数。

int numberofones( int value, int count) {

  int numchars = 8 * sizeof(int);
  int n;

  for(n = 0; n < numchars; n++)
  {
    if(value & (1 << (numchars - 1 - n))) {
     count++;
    }
  }
  return count;
}

【问题讨论】:

  • 不,右移是符号扩展。移位超过位数是未定义的。
  • @yano -- 将负值向左移位会导致未定义的行为;将非负值向左移位(只要结果可表示)是明确定义的。
  • 啊,哎呀,这是1 转移了,我在想numchars .. 看起来不够仔细
  • @yano -- 不过,在使用移位运算符时,使用unsigned 类型是一个好习惯....
  • @wildplasser 从技术上讲:“E1 >> E2 的结果是 E1 右移 E2 位位置 [...] 如果 E1 具有带符号类型和负值,则结果值是实现定义的。” 根据第 6.5.7 节。

标签: c gcc computer-science


【解决方案1】:
int numberofones( int value) {

  int numchars = 8 * sizeof(int);
  int n;
  int count = 0 ;

  for(n = 0; n < numchars; n++)
  {
    if(value & (1 << n))
      count++;
  }
  return count;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多