[操作符】求两个数二进制中不同位的个数

【题目名称】

求两个数二进制中不同位的个数

【题目内容】

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 

输入例子:1999 2299

输出例子:7

【位操作符】

& //按位与

| //按位或

^ //按位异或

注:他们的操作数必须是整数

& :对应的二进制位都为1 时,则为1;否则为0

| :只要对应的二进制位有一个是1,结果就是1,同为0,才是0

^:对应的二进制位相同为0;不同为1

 [代码实现】

#include <stdio.h>


int main() {
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF) { // 注意 while 处理多个 case
        int c = a^b;
        int count = 0; 
        for(int i = 0; i<32; i++)
        {
            if((c&1) == 1)
            {
                count++;
            }
            c=c>>1;
        }
        printf("%d\n", count);
    }
    return 0;
}

1:00000000000000000000000000000001

假设

c=00000000000000000000000000010101

只有c最后一位为1时,c&1==1

所以用for循环遍历32位

遍历完一位再用>> 右移操作符,把c最后一位移除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用异或操作符运算符来个整数的哈密顿距离。具体思路是:将个整数做异或操作,得到一个新的整数,然后统计这个新整数二进制表示1的个数即可。 以下是示例代码实现: ```java import java.util.Scanner; public class HammingDistance { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); int xor = m ^ n; // 个整数做异或操作 int hammingDistance = 0; // 统计xor二进制表示1的个数 while (xor != 0) { if ((xor & 1) == 1) { hammingDistance++; } xor >>>= 1; // 无符号右移一 } System.out.println(hammingDistance); } } ``` 在上述代码,我们首先通过Scanner类获取输入的个整数m和n。然后使用异或操作符^得到一个新的整数xor,这个新整数的二进制表示每个上的值表示原来个整数对应上的值是否相同。接着,我们使用while循环遍历每个,统计xor二进制表示1的个数。在循环,我们使用运算符&来判断每个是否为1,如果是则计数器hammingDistance加1,然后使用无符号右移运算符>>>将xor右移一,继续遍历下一。最后,输出hammingDistance即可得到M和N的哈密顿距离。 ### 回答2: 先将给定的个整数转换成二进制表示。例如,假设M=5,N=10,那么它们的二进制表示分别为M=0000 0000 0000 0000 0000 0000 0000 0101,N=0000 0000 0000 0000 0000 0000 0000 1010。 接下来,我们需要计算二进制数的哈密顿距离。哈密顿距离定义为个数二进制不同个数。 我们可以通过逐比较二进制数的每一来计算哈密顿距离。如果二进制数的相应不同,那么哈密顿距离增加1;如果相应相同,哈密顿距离不变。 举个例子,比较M和N的第1时,我们发现它们的值分别为0和0,二者相同,哈密顿距离不变。比较第2时,它们的值分别为0和1,二者不同,哈密顿距离增加1。继续比较后面的,我们可以得到M和N的哈密顿距离。 因此,M和N的哈密顿距离为1。 最后,将计算得到的哈密顿距离输出即可。 值得注意的是,根据题目要,给定的整数为32,因此计算哈密顿距离时需要比较32次。 ### 回答3: 要计算个整数M和N的哈密顿距离,可以通过以下步骤实现: 1. 将M和N转换为二进制表示。32整数在二进制有32个,每个要么是0,要么是1。 2. 对应置上的二进制进行比较。从最高开始比较,如果对应上的二进制数字不相同,则哈密顿距离加1;如果相同,则不加1。 3. 继续比较下一个置上的二进制,直到比较完所有32个。 4. 输出哈密顿距离。 例如,假设输入的整数M和N分别为10和15: M的二进制表示为00000000 00000000 00000000 00001010 N的二进制表示为00000000 00000000 00000000 00001111 我们从最高开始比较: 第1:M的二进制为0,N的二进制为0,相同; 第2:M的二进制为0,N的二进制为0,相同; 第3:M的二进制为0,N的二进制为0,相同; 第4:M的二进制为0,N的二进制为0,相同; 第5:M的二进制为1,N的二进制为1,相同; 第6:M的二进制为0,N的二进制为1,不同,哈密顿距离+1; 第7:M的二进制为1,N的二进制为1,相同; 第8:M的二进制为0,N的二进制为1,不同,哈密顿距离+1; ... 第32:M的二进制为0,N的二进制为1,不同,哈密顿距离+1; 因此,M和N的哈密顿距离为3。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值