有关面试中常见位运算总结

来源:互联网 发布:淘宝最近没生意 编辑:程序博客网 时间:2024/05/22 01:56

1.二进制中1的个数


 int NumberOf_1(int n)
 {
  int count = 0;
  while(n)
  {
   count++;
   n = n & (n - 1);
  }
  return count;
 }


 2.一个数是否是2的N次方

 int Is_2N(int n)
 {
  int tmp = n & (n-1);
  if(tmp == 0)
   return 1;
  else
   return 0;
 }

 3.两个数m和n,改变m中二进制表示中的多少位才能得到n

(1)求这两个数的异或(两个数不同的位置都为1,这些位置都需要改变)

(2)统计异或结果中1的个数

 int StepChangeTo(int m, int n)
 {
  int tmp = m ^ n;
  return NumberOf_1(tmp);
 }

 

4.不用+-*/求两数的和

 int Add(int num1, int num2)
 {
  int sum, carry;
  do
  {
   sum = num1 ^ num2;
   carry = (num1 & num2) << 1; //进位,两个数只有在某个位置都为1才有进位

   num1 = sum;
   num2 = carry;
  }while(num2 != 0);
  
  return num1;
 } 

 

5.求N!的二进制表示中最低位的1的位置

从右向左从1 数起

一个数的二进制表示中如果最后是m个0,则这个数有m个质因数2,如36的二进制表示为

100100,它最后有2个0,36=2*2*9,可以看到有2个2,则最低位的1,只比质因数2的个

数多一个,它在第2+1=3位

题目转化为求N!中含有质因数的个数,等于[N/2]+[N/4]+[N/8]+[N/16]+...

[N/2]表示不大于N的数中所有2的倍数贡献一个2

 int lowestOne(int N)
 {
  int result = 0;
  while(N)
  {
   N >>= 1;        //(N /= 2)
   result += N;
  }
  return  result;
 }

 

原创粉丝点击