小米笔试题
题目:世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?
输入例子:
1999 2299
输出例子:
7
背景知识:将两个二进制数变成等长(较短的那个高位补0),然后将两个二进制数进行按位“异或”,结果中为1的那些位,就是这两个二进制数不同的位。
在计算机中的数据的保存和运算都是以二进制的形式进行的,但不是直接的原码,而是原码的补码,也就是说在计算机中,数据的运算都是以数据的补码进行的。
异或:
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
1、一个负整数(或原码)与其补数(或补码)相加,和为模。
2、对一个整数的补码再求补码,等于该整数自身。
3、补码的正零与负零表示方法相同。
正整数的补码是其二进制表示,与原码相同
求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1
具体代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int n = 1999; 7 int m = 2299; 8 int compare1 = 0, compare2 = 0; 9 int result = 0, count = 0; 10 11 if(m >= 0 ) 12 compare1 = m; 13 else 14 compare1 = (~m)+1;//如果是负数,补码的补码就是源码 15 16 if(n >= 0 ) 17 compare2 = n; 18 else 19 compare2 = (~n)+1; 20 21 result = compare1 ^ compare2;//按位异或 22 //printf("%d\n",result); 23 24 while(result != 0){ 25 26 if(result%2 == 1)count++;//计算有几个1 27 result = result / 2; 28 29 } 30 return count; 31 }