【问题标题】:Counting number of one's in a binay number [duplicate]计算二进制数中的个数[重复]
【发布时间】:2014-05-04 05:51:01
【问题描述】:

这段代码是如何工作的

例如

input: 5(101)
ouput: 2

功能是

scanf("%d", &a);
while(a)
{
oneina++;
a=a&(a-1);
}
printf("%d", oneina);

【问题讨论】:

  • @BurhanKhalid 阅读了标题。
  • 拿起铅笔和纸,试着弄清楚a=a&(a-1) 做了什么。
  • @BurhanKhalid 那么坦率地说,你认为它应该做什么? 非常明显它应该(并且确实)计算给定整数的二进制表示中的个数。
  • 错误,什么?我想您是在问 代码是如何工作的?我不明白这里的问题。
  • 对不起我的英语,我期待一个一般推导形式的解决方案(适用于所有情况),而不是示例的解释......

标签: c bit-manipulation bit bitwise-operators bitwise-and


【解决方案1】:

a-1a,第一个 1(从右起)出现在 a 中,为 0,该位右侧的所有位为 1。因此,当您按位计算它们时,您一次从a 中删除一个1

【讨论】:

    【解决方案2】:
    scanf("%d", &a);      // a = 0111b (7)
    
    while(a)              // a = 0111b (7) : TRUE
    
       oneina++;          // oneina 0 --> 1
    
       a=a & (a-1);       // a = 0111b (7) & 0110b (6) = 0110b (6)
    
    while(a)              // a = 0110b (6) : TRUE
    
       oneina++;          // oneina 1 --> 2
    
       a=a & (a-1);       // a = 0110b (6) & 0101b (5) = 0100b (4)
    
    while(a)              // a = 0100b (4) : TRUE
    
       oneina++;          // oneina 2 --> 3
    
       a=a & (a-1);       // a = 0100b (4) & 0011b (3) = 0000b (0)
    
    while(a)              // a = 0000b (4) : FALSE
    
    printf("%d", oneina); // '3'
    

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2022-07-07
      • 2013-09-04
      相关资源
      最近更新 更多