(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代码:
package com.sailang.bitoperation; public class BitOperation { public static void main(String[] args) { BitOperation a = new BitOperation(); int b = a.NumberOf1(0); int c = a.AnotherNumberOf1(-9); System.out.println(b); System.out.println(c); } //常规方法 public int NumberOf1(int n) { int count = 0; int flag = 1; while(flag != 0) { if((n & flag) != 0) { count++; } flag = flag << 1; } return count; } //精妙解法 public int AnotherNumberOf1(int n) { int count = 0; while(n != 0) { count ++; n = (n - 1) & n; } return count; } }
实例二:
package com.sailang.bitoperation; /** * 用一条语句判断一个整数是不是2的整数次方 * @author lizhongyi * */ public class Test { public static void main(String[] args) { Test test = new Test(); if(test.isSquareOf2(3)) { System.out.println("是2的整数次方"); } else { System.out.println("不是2的整数次方"); } } public boolean isSquareOf2(int n) { return ((n - 1) & n) == 0 ? true : false; } }
实例三:
输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。比如10的二进制表示为1010,13的二进制表示为1101,需要改变1010中3位才能得到1101。