程序员人生 网站导航

【基础算法】位运算-基本运算

栏目:互联网时间:2014-11-04 09:05:56

上1篇中我们分析了位的定义,这1篇中我们分析1下位的基本运算

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种基本运算非常重要,每位想要掌握位运算的朋友,上面的基本运算都需要非常熟练的掌握


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐