求一个整数的补码中1的个数

现在有两种比较好的方法求:一个整数的补码中1的个数;

1:int 类型的整数是32个比特位,该整数如果&1的话,如果最右边的数是1,则得到的数就是1,如果是0,得到的就是0了,大家可以多了解了解&这个符号的作用,它叫按位与,对应的二进制数只有都是1才得到1,否则为0;

那么现在可以判断最后一位是不是1,现在如果把32位都&1,则知道了补码的所有1的位数;现在可以用>>右移操作符,把32位数一一向右,都与1&,就可以得到32位中所有的1的个数;

#include <stdio.h>
int count_bit(int i)
{
	int count = 0,j;
	for (j = 0; j < 32; j++) {
		if (1 == ((i >> j) & 1))
			count++;
	}
	return count;
}
int main()
{
	int i, ret;
	scanf("%d", &i);
	ret = count_bit(i);
	printf("%d", ret);
	return 0;
}

第二种方法:这种方法是用了n&(n-1)会减少一个1,大家可以自己试试看,每次用这种方式都会少一个二进制的1;

#include <stdio.h>
int count_bit(int i)
{
	int count = 0;
	while (i)
	{
		i = i & (i - 1);
		count++;
	}
	return count;
}
int main()
{
	int i, ret;
	scanf("%d", &i);
	ret = count_bit(i);
	printf("%d", ret);
	return 0;
}

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个输出整数原码、反码、补码的例子: ```python num = -18 bits = num.bit_length() + 1 print("原码:", bin(num & ((1 << bits) - 1))) print("反码:", bin(num & ((1 << bits) - 1) ^ ((1 << bits) - 1))) print("补码:", bin(num & ((1 << bits) - 1) ^ ((1 << bits) - 1) - 1)) ``` 输出结果为: ``` 原码: -0b10010 反码: -0b10011 补码: -0b10010 ``` 其,`num.bit_length()`用于获取`num`的二进制表示的位数,`bits`为二进制表示的位数加1,`1 << bits`为一个二进制数,其最高位为1,其余位为0,表示一个比`num`的二进制表示的位数多1的二进制数。`((1 << bits) - 1)`为一个二进制数,其所有位都为1,表示一个比`num`的二进制表示的位数多1的全1二进制数。`num & ((1 << bits) - 1)`用于将`num`的二进制表示截取为`bits`位,即去掉多余的高位。`((1 << bits) - 1) ^ ((1 << bits) - 1)`为一个二进制数,其所有位都为0,表示一个比`num`的二进制表示的位数多1的全0二进制数。`num & ((1 << bits) - 1) ^ ((1 << bits) - 1)`用于将`num`的二进制表示的符号位取反,即将其变为反码。`((1 << bits) - 1) ^ ((1 << bits) - 1) - 1`为一个二进制数,其最高位为0,其余位为1,表示一个比`num`的二进制表示的位数多1的全1二进制数减1,即一个比`num`的二进制表示的位数多1的全1二进制数的补码。`num & ((1 << bits) - 1) ^ ((1 << bits) - 1) - 1`用于将`num`的二进制表示的符号位取反并加1,即将其变为补码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值