题目链接
#include <iostream>
using namespace std;
int hammingDistance(int m, int n) {
int xorResult = m ^ n; // 异或操作会生成一个新的整数,其二进制表示中的每一位表示m和n对应位是否相同
int count = 0; // 初始化计数器
while (xorResult != 0) {
count += xorResult & 1; // 检查最低位是否为1,然后递增计数器
xorResult >>= 1; // 右移异或结果
}
return count;
}
int main() {
int m, n;
cin >> m >> n;
int result = hammingDistance(m, n);
cout << result << endl;
return 0;
}
/**
* 思路:使用异或运算
* 异或运算的性质,如果两个对应位置上的二进制数字不同,则结果为 1,如果相同,则为 0
*
* 算法步骤:
* 对给定的两个整数 m 和 n 进行异或运算,得到结果 xorResult。
*
* 初始化一个计数器 count 为 0,用于统计 xorResult 中1的个数。
*
* 循环遍历 xorResult 的每一位:
* 检查 xorResult 最低位是否为1,如果是则递增 count。
* 右移 xorResult 一位,以继续检查下一位。
*
* 返回 count,即为二进制中不同位数的个数。
*
*/
import java.util.Scanner;
public class Main {
public static int hammingDistance(int m, int n) {
int xorResult = m ^ n; // 异或操作会生成一个新的整数,其二进制表示中的每一位表示m和n对应位是否相同
int count = 0; // 初始化计数器
while (xorResult != 0) {
count += xorResult & 1; // 检查最低位是否为1,然后递增计数器
xorResult >>= 1; // 右移异或结果
}
return count;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int result = hammingDistance(m, n);
System.out.println(result);
}
}
def count_bits_diff(a: int, b: int) -> int:
"""
异或操作是一种常用的位操作符,它的特点是相同的位取反,不同的位保持不变。
例如,如果我们将两个二进制数101(对应十进制数5)和110(对应十进制数6)进行异或操作,结果将是011(对应十进制数3)。
这是因为在这两个二进制数中,第一个位都是1,所以结果的第一个位是0; 第二个位一个是0,另一个是1,所以结果的第二个位是1;
第三个位都是1,所以结果的第三个位是0。因此,异或操作的结果就是将这两个二进制数中不同的位保留下来。
在这个问题中,我们需要找出两个数字之间的不同位,而异或操作正好能满足我们的要求。
当我们对两个数字执行异或操作时,结果就是它们所有不同的位组成的二进制数。
因此,我们只需要将结果转换为十进制数,就可以得到不同位的数量。
Python快捷解法:使用了bin函数将结果转换为二进制字符串,然后通过count方法统计字符串中'1'的出现次数,从而得到不同位的数量。
"""
return bin(a ^ b).count('1')
a, b = map(int, input().split())
res = count_bits_diff(a, b)
print(res)
//方式一,转换成栈的字符串,然后一一匹配
package main
import (
"fmt"
"strconv"
)
func transform(x int) string {
var temp string
for x > 0 {
temp = temp+strconv.Itoa(x%2)
x /= 2
}
return temp
}
func main() {
var n, m int
fmt.Scan(&n, &m)
res := 0 // 思路,用栈转化求出二进制字符串,然后一一比对即可
str1 := transform(n)
str2 := transform(m)
for i := 0; i < 32; i++ {
if i < len(str1) && i < len(str2) {
if str1[i] != str2[i] {
res++
}
} else if i >= len(str1) && i < len(str2) {
if str2[i] == '1' {
res++
}
} else if i >= len(str2) && i < len(str1) {
if str1[i] == '1' {
res++
}
} else {
break
}
}
fmt.Println(res)
}
//方式2,直接位运算
package main
import "fmt"
func main() {
var n, m int
fmt.Scan(&n, &m)
res := 0
for i := 0; i < 32; i++ {
x1 := (n >> uint(i)) & 1
x2 := (m >> uint(i)) & 1
if x1 != x2 {
res++
}
}
fmt.Println(res)
}
#include <stdio.h>
int hammingDistance(int m, int n) {
int xorResult = m ^ n; // 异或操作会生成一个新的整数,其二进制表示中的每一位表示m和n对应位是否相同
int count = 0; // 初始化计数器
while (xorResult != 0) {
count += xorResult & 1; // 检查最低位是否为1,然后递增计数器
xorResult >>= 1; // 右移异或结果
}
return count;
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
int result = hammingDistance(m, n);
printf("%d\n", result);
return 0;
}