位运算总结—各大公司笔试面试题

来源:互联网 发布:淘宝客服怎样登录 编辑:程序博客网 时间:2024/05/11 03:31
 140人阅读 评论(0) 收藏 举报

(1)对于位运算有五种运算:与、或、异或、左移和右移。这五种运算都要掌握。

(2)左移运算符m<<n表示把m左移n位。左移n位的时候,最左边的n位将被被丢弃,同时在最右边补上n个0。(在左移n位的时候,有些情况下,相当于原数乘以2的n次方

(3)右移,对于无符号数,右移右边补0,对于有符号数,右移右边补符号位。(对于右移,任何情况下都相当于除

(4)在笔试面试中最常考的题目:

题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。

解法1:最常规的解法,通过移位运算来实现。思路就是判断某一位上是否是1

解法2:把一个整数减去1,再和原整数做与运算,会把该整数最右边的一个1变成0(记住。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

注:两种解法的详细说明可以看《剑指Offer》这本书,很不错的书!

下面是两种解法的Java代码:

[java] view plaincopy
  1. package com.sailang.bitoperation;  
  2.   
  3. public class BitOperation  
  4. {  
  5.     public static void main(String[] args)  
  6.     {  
  7.         BitOperation a = new BitOperation();  
  8.         int b = a.NumberOf1(0);  
  9.         int c = a.AnotherNumberOf1(-9);  
  10.           
  11.         System.out.println(b);  
  12.         System.out.println(c);  
  13.     }  
  14.     //常规方法  
  15.     public int NumberOf1(int n)  
  16.     {  
  17.         int count = 0;  
  18.         int flag = 1;  
  19.           
  20.         while(flag != 0)  
  21.         {  
  22.             if((n & flag) != 0)  
  23.             {  
  24.                 count++;  
  25.             }  
  26.             flag = flag << 1;  
  27.         }  
  28.         return count;  
  29.     }  
  30.     //精妙解法  
  31.     public int AnotherNumberOf1(int n)  
  32.     {  
  33.         int count = 0;  
  34.           
  35.         while(n != 0)  
  36.         {  
  37.             count ++;  
  38.             n = (n - 1) & n;  
  39.         }  
  40.         return count;  
  41.     }  
  42. }  


 实例二:

[java] view plaincopy
  1. package com.sailang.bitoperation;  
  2. /** 
  3.  * 用一条语句判断一个整数是不是2的整数次方 
  4.  * @author lizhongyi 
  5.  * 
  6.  */  
  7. public class Test  
  8. {  
  9.     public static void main(String[] args)  
  10.     {  
  11.         Test test = new Test();  
  12.           
  13.         if(test.isSquareOf2(3))  
  14.         {  
  15.             System.out.println("是2的整数次方");  
  16.         }  
  17.         else  
  18.         {  
  19.             System.out.println("不是2的整数次方");  
  20.         }  
  21.     }  
  22.     public boolean isSquareOf2(int n)  
  23.     {  
  24.         return ((n - 1) & n) == 0 ? true : false;  
  25.     }  
  26. }  


 实例三:

输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。比如10的二进制表示为1010,13的二进制表示为1101,需要改变1010中3位才能得到1101。

 

 

原创粉丝点击