問題:
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=0;
- 0|1=0;
- 0|0=0;
/**
* |是OR運算符,是一種位符。有1爲1,全0爲0
* 運算規則如下:
* 1|1=1;
* 1|0=0;
* 0|1=0;
* 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位於算——一個測試搞懂位運算》中有做說明