学习java后,经常在位运算符上犯错误。今天在看HashMap源码的hash算法时又懵逼了。所以,今天在这里记录一下这些位运算符号的用法。
1. 与(&)
当两个操作数中位都为1时,则为1,否则为0。
/**
* 与运算符示例
* @author SHT
*
*/
public class VersusDemo {
public static void main(String[] args) {
//二进制表示形式为0011
int a = 3;
//二进制表示形式为0101
int b = 5;
// 0011
// 0101
//结果 0001
int c = a&b;
System.out.println("a&b="+c);
System.out.println("a&b的二进制表示形式为"+Integer.toBinaryString(c));
}
}
结果为
a&b=1
a&b的二进制表示形式为1
2. 或(|)
当两个操作数中的位有一个为1时,则为1,否则为0。
/**
* 或运算符示例
* @author SHT
*
*/
public class OrDemo {
public static void main(String[] args) {
//二进制表示形式为0011
int a = 3;
//二进制表示形式为0101
int b = 5;
// 0011
// 0101
//结果 0111
int c = a|b;
System.out.println("a|b="+c);
System.out.println("a|b的二进制表示形式为"+Integer.toBinaryString(c));
}
}
结果为
a|b=7
a|b的二进制表示形式为111
3. 非(~)
当操作数中位为1时,结果为0,否则为1。
/**
* 非运算符示例
* @author SHT
*
*/
public class NotDemo {
public static void main(String[] args) {
//二进制表示形式为0000 0000 0000 0000 0000 0000 0000 0011
int a = 3;
//结果 1111 1111 1111 1111 1111 1111 1111 1100
int c = ~a;
System.out.println("~a="+c);
System.out.println("~a的二进制表示形式为"+Integer.toBinaryString(c));
}
}
结果为
~a=-4
~a的二进制表示形式为11111111111111111111111111111100
4. 异或(^)
当两个操作数中的位相同时为0,不同为1。
/**
* 异或运算符示例
* @author SHT
*
*/
public class ExclusiveOrDemo {
public static void main(String[] args) {
//二进制表示形式为0011
int a = 3;
//二进制表示形式为0101
int b = 5;
// 0011
// 0101
//结果 0110
int c = a^b;
System.out.println("a^b="+c);
System.out.println("a^b的二进制表示形式为"+Integer.toBinaryString(c));
}
}
结果为
a^b=6
a^b的二进制表示形式为110
5. 位移运算符
(1)左移运算符(<<):右边补0。
(2)右移运算符(>>):左边补0(除符号位)
(3)无符号右移运算符(>>>):左边补0。
/**
* 位移运算符
* @author SHT
*
*/
public class YunSuanFuDemo {
public static void main(String[] args) {
int n = 10;
printInfo(n);
n = n << 1;
printInfo(n);
n = n >> 1;
printInfo(n);
n = n >>>1;
printInfo(n);
}
public static void printInfo(int n) {
System.out.println(n+"的二进制表示形式:"+Integer.toBinaryString(n));
}
}
结果为
10的二进制表示形式:1010
20的二进制表示形式:10100
10的二进制表示形式:1010
5的二进制表示形式:101