小米笔试题

题目:世界上有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 }

 

posted @ 2015-06-11 21:51  Friday92  阅读(370)  评论(0编辑  收藏  举报