c语言小练习

练习一:求一个整数在内存中存储的二进制数中1的个数(针对的是补码)

补充知识:

1.一个数模2就能得到二进制数中的最低位,比如15的二进制是1111,15%2=1;

2.一个数除2就能去掉这个数的二进制数中的最低位,比如15/2=7, 7的二进制是111

方法一: 

//我们可以定义1个count变量,用来统计1的个数,
//首先我们先对要操作的数进行模2操作,得到二进制的最低位,然后再判断是不是等于1,然后再进行除2操作,去掉一个最低位,如此循环往复,直到最终的结果变成0
int a=15;
int count=0;
while(a)
{
if(a%2==1)
 {

count++;

}

a=a/2;


}
printf("%d\n",count);

//但是这种方法有弊端,它只针对正数,如果是负数结果就会出错

方法二:利用按位与&操作符和右移>>操作符

int a=-1;
int i=0;
//变量i代表整个循环需要右移的次数,从第一位开始右移,第一位右移0位,整型一共有32位,第32位需要右移31位
int count=0;

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

if(((a>>i)&1)==1)
{
count++;
}

}
printf("%d\n",count);

 方法三:利用n&(n-1)表达式,每执行完一次这个表达式就会去掉一个1,它的核心思想在于二进制减1,如果是0它借不了,一定找下一位,如果下一位刚好是1,借走后就变成0了,如果原本的那一位是1,借出去后就变成0了,再与原来的数进行按位与,刚好就去掉了1个1

int a=-1;
int count=0;
while(a)
{
a=a&(a-1);
count++;
}
printf("%d\n",count);
 练习2:判断一个数是否是2的n次方

补充知识:如果一个数是2的n次方,那么它的二进制数中一定只有1个1,按照这个规律,我们还是可以用n&(n-1)这个表达式来解决,因为n&(n-1)表达式每执行完一次,就一定会去掉1个1,我们在这个练习中,不用统计有多少个1,只需要判断n&(n-1)==0,如果执行完这个表达式结果为20,就证明只有一个1,如果不是就代表他不是2的n次方

int a=0;
scanf("%d",&a);
if((a&(a-1))==0)
{

printf("yes\n");

}

else
{
printf("no\n");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值