掌握位运算对了解计算机本身具有很大的帮助,这需要长时间不断地用二进制思维来“模拟”计算机的运算过程^-^才能熟练,建议大家对于1111=15(10)=FF(16)=17(8)以内的所有二进制表示都要牢记在心。下面本人介绍在位运算方面应该知道的一些常用方法,很希望大家能把关于位运算的一些技巧共享出来:)
AND运算:
AND一般都是用来做清“零”操作,因为一些特殊的需求可能会用到这样的循环,1,2,3,4,5,6,7.....15,0。注意是从1开始然后到0结束,这类应用最早我实在一个画图程序中看到的代码,画了一个矩形,然后程序自动分配16个点,所以就看到了类似下面的代码。
for (int i = 1; i <= 16; i++){
System.out.println(i & 15);
}
当然了你只要用最后一个数进行AND运算都是回归到0。
如果我想获得它的前4位:
0101 1111
AND
1111 0000
=0101 0000
同理,后四位:
0101 1001
AND
0000 1111
=0000 1001
还有时会用AND运算来判断一个数是奇数还是偶数,很简单只要跟1比较就可以了。
for(int i = 0;i < 100; i++){
if((i & 1) == 0)
System.out.println("偶数:" + i);
}
OR运算:
任何数跟“0”运算或者跟自己运算都是自己。
其主要用来将位的值置为“1”,例如将后四位置为1。
1000 1001
OR
0000 1111
=1000 1111
同理将前四位置为“1”
0001 1001
OR
1111 0000
=1111 1001
XOR运算:
最早知道XOR运算的时候,不知道是那个公司出的面试题,说交换A,B两个值不使用第三者变量。当时是一头雾水不知如何下手,其实XOR用起来很简单:
A = A ^ B
B = B ^ A
A = A ^ B
任何两个相等的值XOR运算后都等于零,上面的等式拆开来就是:
B = B ^ (A ^ B) B被清掉
A = (A ^ B) (B ^ A ^ B) 剩下个B
如果等号两边同时具有相同的数,就不用去拆开了:
B = B ^ (A ^ B)
A = A ^ (B ^ A)
NOT运算:
如果想得到这个数的负数很简单,NOT运算后再OR1即可,当然这种方式不安全,因为无符号和有符号并不是等长的,超边界的时候会出现问题。
~25 = -26
~25 | 1 = -25
<<运算:
就是乘2的N次方运算:
3 << 2 = 3 * 2^2 = 12
-3 << 2 = -3 * 2^2 = -12
>>运算:
除2的N次方运算:
16 >> 2 = 16 / 2^2 = 4
-16 >> 2 = -16 / 2^2 = -4
如果不同长度的两个数据进行运算,系统自动将两者的长度对其,高端为补"零",有符号的数符号位始终为"1"。
各位还有什么经验,可以一起来信分享。