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

(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。

 

 

你可能感兴趣的:(位运算总结—各大公司笔试面试题)