C程序查找给定数字所需的位数

时间:2018-07-12 15:18:18

标签: c

我是编程的新手,试图理解以下程序。

该程序获取将整数存储为数字所需的最少位数。

#include <stdio.h>

/*function declaration
* name      : countBit
* Desc      : to get bits to store an int number
* Parameter : int 
* return    : int 
*/
int countBit(int);
int main()
{
   int num;
   printf("Enter an integer number :");
   scanf("%d",&num);

   printf("Total number of bits required = %d\n",countBit(num));
   return 0;
}

int countBit(int n)
{
   int count=0,i;
   if(n==0) return 0;
   for(i=0; i< 32; i++)
   {    
      if( (1 << i) & n)
         count=i;
   }

   return ++count;
}

您能解释一下if( (1 << i) & n)条件如何工作吗?

3 个答案:

答案 0 :(得分:1)

首先,您应该阅读Bitwise Operators


for(i=0; i< 32; i++)
{   
    // Check if the bit at position i is set to 1
    if( (1 << i) & n)
        count=i;
}

用简单的英语来说,这是在检查所有“置位”位的最高位置是什么。

  

该程序获取将整数存储为数字所需的最少位数。

获得最大“置位”位的位置将告诉我们需要存储多少位。如果我们使用较少的位数,那么我们会将最大可能数减少到所需的整数以下。

答案 1 :(得分:1)

“ <<”和“&”是按位运算符,用于操纵给定(通常为无符号整数)变量的位。您可以阅读有关此类运算符here的更多信息。就您而言,

1<<i

是二进制表示为1的数字,后跟i-1个零(并且也仅以零开头)。总体而言,支票

(1<<i)&n 

如果变量n的第i位为1,则求值为true,否则为false,因此循环会找出给定数字中最左边的位为1。

答案 2 :(得分:0)

如果您了解按位运算符,这将非常简单。

移位运算符: <<是左移位运算符,用于将值移位指定的位。在C中,x << 1x移1位。

现在让我们只考虑8位值,并假设x是十进制的100,在十六进制编号系统中是0x64,而二进制表示形式是{{1} } 使用移位运算符,让该值移位1位。所以,

0110 0100

成为

0 1 1 0 0 1 0 0

作为最后一个(最右端)位将用0 1 1 0 0 1 0 0 0 ^ ^ Discarded Padded 填充。

该数字变为0,在十进制编号系统中为0xC8,是先前值的两倍!

200运算符也是如此,如果没有请尝试一下。结果应该是一半,除非您尝试>>:-)

作为旁注,当您长大并开始研究开发人员使用shell /控制台的方式时,您将了解0x01具有不同的用途。

>运算符:首先,&&&是不同的。第一个是逻辑运算符,第二个是按位运算符。

让我们再次选择一个数字,&
在逻辑100操作中,最终结果始终为true或false。例如,and将导致条件成立,所有其他组合将导致错误的结果。

但是,按位0x64 && 0x64操作是以这种方式使用的:是否设置了0x64的第i th 位?如果是,则结果为true,否则结果为false。

if语句:

and

就是这么做的。对于循环的每次迭代,它都会将if( (1 << i) & n) 左移1位,然后检查i的{​​{1}} th 位是否已设置,如果设置为true,否则为false。

程序员通常为此使用一个宏,这使其更具可读性。

i