问题:
java源码中的位运算是如何使用的?
位运算符的用法
java中的“&”、“|”、“^”、“~”逻辑运算符的使用,此处使用了int类型,4个字节32位
&运算符
&是AND运算符,是一种位运算符。有0为0,全1为1。
运算规则如下:
- 1&1=1;
- 1&0=0;
- 0&1=0;
- 0&0=0;
/**
* &是AND运算符,是一种位运算符。有0为0,全1为1
* 运算规则如下:
* 1&1=1;
* 1&0=0;
* 0&1=0;
* 0&0=0;
*/
@Test
public void test01() {
//a的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
int a = 7;
print2Binary(a);
//b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0010
int b = 2;
print2Binary(b);
//c=a&b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0010
int c = a & b;//十进制为2
System.out.println("a&b=" + c);
print2Binary(c);
}
运算结果:
十进制数[7]二进制补码表示为:111
十进制数[2]二进制补码表示为:10
a&b=2
十进制数[2]二进制补码表示为:10
|运算符
|是OR运算符,是一种位符。有1为1,全0为0
运算规则如下:
- 1|1=1;
- 1|0=1;
- 0|1=1;
- 0|0=0;
/**
* |是OR运算符,是一种位符。有1为1,全0为0
* 运算规则如下:
* 1|1=1;
* 1|0=1;
* 0|1=1;
* 0|0=0;
*/
@Test
public void test02() {
//a的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
int a = 7;
print2Binary(a);
//b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0010
int b = 2;
print2Binary(b);
//c=a|b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
int c = a | b;//十进制为7
System.out.println("a|b=" + c);
print2Binary(c);
}
运算结果:
十进制数[7]二进制补码表示为:111
十进制数[2]二进制补码表示为:10
a|b=7
十进制数[7]二进制补码表示为:111
^运算符
^是异或运算符,是一种位符。相同为0,不同为1
运算规则如下:
- 1^1=0;
- 1^0=1;
- 0^1=1;
- 0^0=0;
/**
* ^是异或运算符,是一种位符。相同为0,不同为1
* 运算规则如下:
* 1^1=0;
* 1^0=1;
* 0^1=1;
* 0^0=0;
*/
@Test
public void test03() {
//a的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
int a = 7;
print2Binary(a);
//b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0010
int b = 2;
print2Binary(b);
//c=a^b的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0101
int c = a ^ b;//十进制为5
System.out.println("a^b=" + c);
print2Binary(c);
}
运算结果:
十进制数[7]二进制补码表示为:111
十进制数[2]二进制补码表示为:10
a^b=5
十进制数[5]二进制补码表示为:101
~运算符
~是非运算符,是一种位符。0取反为1,1取反为0
运算规则如下:
- ~1=0;
- ~0=1;
/**
* ~是非运算符,是一种位符。0取反为1,1取反为0
* 运算规则如下:
* ~1=0;
* ~0=1;
*/
@Test
public void test04() {
//a的二进制补码表示为:0000 0000 0000 0000 0000 0000 0000 0111
int a = 7;
print2Binary(a);
/**
* b按位二进制补码表示为 1111 1111 1111 1111 1111 1111 1111 1000
* b的二进制原码表示则为 1000 0000 0000 0000 0000 0000 0000 1000
* 原码的第一位为符号位1代表负数,值为-8
*/
int b = ~a;
System.out.println("~a取反为:" + b);
print2Binary(b);
}
运算结果:
十进制数[7]二进制补码表示为:111
~a取反为:-8
十进制数[-8]二进制补码表示为:11111111111111111111111111111000
其中打印二进制的方法print2Binary
如下:
/**
* 打印十进制数二进制
*
* @param a
*/
private void print2Binary(int a) {
StringBuilder sb = new StringBuilder();
sb.append("十进制数[");
sb.append(a);
sb.append("]二进制补码表示为:");
sb.append(Integer.toBinaryString(a));
System.out.println(sb.toString());
}
其他位运算:<< 、>>在《java位于算——一个测试搞懂位运算》中有做说明
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72692.html