Java程序开发常用的按位运算
在Java语言中有以下几种按位运算符:
^ 按位异或(xor)
& 按位与(and)
| 按位或(or)
<< 左移
>> 右移
~ 按位取反
1、^按位异或运算异或运算规则:同则0,异则1。如5^8如下:
0101
1000
1101 = 13 //result
如此再看把int a,b的值互换,不能使用临时变量这个问题,假设a=5,b=8,a^8的结果是a = 13即:1101。再用a^b
1101 //a
1000 //b
0101 //b = 5 a开始的值
1101 //a
0101 //b
1011 //a = 8 b开始的值
具体实现代码如下:
public void switchValue(int a,int b){
a = a^b;
b = a^b;
a = a^b;
}
这下就可以知道a和b的值互换了并且没有使用任何临时变量。根据以上过程对于异或就有以下几个特点:
A^0 = A, A^A = 0;
A^B^B = A;
A^B^C == C^A^B == B^C^A
这几条特性导致,^异或在某些方面的应用非常的适用。如题:
在一个n长度整数数组中,有一个整数出现了奇次,其他整数出现是偶次,找出这个整数?在这个题目中^异或就可以更好的解决这个问题,根据以上三条特性,出现偶次的整数在^后肯定为0,奇次的整数^后肯定是本身。因此可以把数组中的整数全部^后就可以得到这个数!
2、&按位与按位与的规则如下:同真则真,一假则假。
1 & 1 = 1; 1 & 0 = 0; 0 & 0 = 0; 0 & 1 = 0
根据以上规则如需把某个整数A的值为0,直接可以使用:A = A & 0; 其经常用来屏蔽一些二进制位。例如 n = n & 0177,0177的二进制表示为:001 111 111,上句代码就是把n中除了7个低位的二进制外,其他的全部为0。还有 n = n & 0xFF就是把n中除了8个低位的二进制外,其他的全部为0。
3、| 按位或按位或的规则如下:同假则假,一真则真。
1 | 1 = 1; 1 | 0 = 1; 0 | 0 = 0; 0 | 1 = 1
所以按位或常用来把某些值的某些二进制位设为1。如 A = A | 0XFF。就是把A的底八位的二进制值设置为1。
4、<<左移和>>右移左移和右移是针对整数的二进制进行的。下面分别把8左移2为,把8右移2位。
0000 1000 //8的二进制表示
0010 0000 //32的二进制表示 左移2位的值
0000 0010 //2的二进制表示 右移2位的值
以上不足的位都是用0来补位。因此左移和右移可以从上看出:
A = A >> n,就是A除以2的n次方,A = A << n,就是A乘以2的n次方。
5、~取反取反一看字义就知道取值得反值,~1 = 0,~0 = 1;
小结以上就是语言中的按位运算符了。或许很多代码仔都觉得这个简单,当然确实不复杂,但是在实际的代码中能否使用好,就另当别论了。
- 上一篇
Java通过Jedis连接Redis的三种方式的操作工具类
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
- 下一篇
Tomcat 启动时 SecureRandom 非常慢解决办法
最近使用阿里云的 Ubuntu 16.04 ESC服务器运行 Tomcat时发现,Tomcat启动的特别慢,通过查看日志,发现时间主要花在实例化 SecureRandom对象上了。实例化该对象使用了253秒,导致整个应用启动了275秒之久。