1. 程式人生 > >【基礎算法】位運算-基本運算

【基礎算法】位運算-基本運算

-c 我們 stat 掌握 log == led clas pre

上一篇中我們分析了位的定義,這一篇中我們分析一下位的基本運算

1. 移動

左移n位:乘以2的n次方

右移n位:除以2的n次方

(~0)左移n位:在1後面加上n個0 (註:~0不等於1。等於11…11)

x&(~0<<n):將最右邊的n位清零

正數左移右邊補0

正數右移左邊補0

負數左移右邊補1

負數右移左邊補1


移動的作用總結:乘2,除2。右n位清零


2. 異或

x^0=x

x^x=0

x^1=~x

x^~x=1


異或的作用總結:取數,清零,取非,清1


3. 且運算

x&0=0

x&1=x

x&x=x


且運算的作用總結:位清零,位取數,取數


4. 或運算

x|0=x

x|1=1

x|x=x


或運算的作用總結:位清1,取數。


5. 取位

先把1左移i位

再把num與i做“與運算”

假設是0返回0,否則返回1

	public static int getBit(int num, int i) {
		i = (1 << i);
		num = num & i;
		if (num == 0)
			return 0;
		return 1;
	}
也能夠直接把這個數右移i位後和1做與運算

	public static int getBit2(int num, int i) {
		return (num>>i)&1;
	}

6. 設位

設置第i位的方法:X|00000010 (i=1)

	public static int setBit(int num, int i) {
		i = 1 << i;
		return num | i;
	}


7. 清位

把第i位清0的方法

	public static int clearBit(int num, int i) {
		i = 1 << i;
		i = ~i;
		num = num & i;
		return num;
	}

把最左邊位到i位都清0的方法

	public static int clearBitLtoI(int num, int i) {
		i = 1 << i + 1;
		i = i - 1;
		num = num & i;
		return num;
	}

把第i位到第1位都清0的方法

	public static int clearBitItoR(int num, int i) {
		i = 1 << i + 1;
		i = i - 1;
		i = ~i;
		num = num & i;
		return num;
	}

8. 更新位

步驟:清位+設位

	public static int updateBit(int num, int i, int w) {
		int temp = ~(1 << i);
		num = num & temp;
		w = w << i;
		num = num | w;
		return num;
	}

以上8種基本運算很重要。每一位想要掌握位運算的朋友,上面的基本運算都須要很熟練的掌握


【基礎算法】位運算-基本運算