我是编程的新手,试图理解以下程序。
该程序获取将整数存储为数字所需的最少位数。
#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)
条件如何工作吗?
答案 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 << 1
将x
移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