哈喽,本来打算讲一讲HashMap的原理的,但是发现在HashMap中用到了一些位运算符,所以打算先来讲讲Java的位运算符,这样在讲HashMap的时候更容易理解。
Java位运算符分为 &,|,^,~,>>,<<,位运算符是对2进制进行位运算,在2进制中1表示true,0表示false。
下面我们依次来讲解下:
&(与运算符)
与运算符表示的是都为true的时候才是true,否则为false。
1 & 0 = 0
1 & 1 = 1
0 & 0 = 0
栗子:
3 & 6
我们先得到3和6的2进制,分别为
00000011
00000110
在与运算过后得到的是
00000010
所以最后结果转换为10进制为2。
|(或运算符)
或运算符表示的是如果有一个为true,那么就为true,否则为false。
1 & 0 = 1
1 & 1 = 1
0 & 0 = 0
栗子:
5 | 7
我们先得到5和7的二进制,分别为
00000101
00000111
在或运算过后为
00000111
所以最后转换为10进制为7。
^(异或运算符)
异或运算符表示的是如果相同,则为false,否则为true。
1 & 0 = 1
1 & 1 = 0
0 & 0 = 0
栗子:
4 ^ 9
我们先得到4和9的二进制,分别为
00000100
00001001
在异或运算过后为
00001101
转换为10进制为13。
~(取反运算符)
取反表示为true为false,false为true。
~ 1 = 0
~ 0 = 1
在讲栗子之前先说一下2进制的最高位是用来表示正负的,如果最高位为0,则为正数,如果为1,则为负数。比如-6,转换为2进制就是6的2进制取反然后+1。
6的2进制为(因为Int是32位,所以我们用32位表示更加清楚)
00000000 00000000 00000000 00000110
那么取反过后为
11111111 11111111 11111111 11111001
因为是-6,所以我们在6取反过后还要+1,那么-6的2进制为
11111111 11111111 11111111 11111010
在讲完正负如何转换2进制过后我们来举一个取反的栗子
~6
我们先拿到6的2进制为
00000000 00000000 00000000 00000110
取反过后为
11111111 11111111 11111111 11111001
然后转换为10进制,因为最高位为1,所以为负数,负数转换为10进制我们要先-1,再取反,最后得到的数前面加一个负号就好。
所以我们最后得到的是 -7。
>>(右移运算符)
右移就是将2进制向右移动。
栗子:
5 >> 2
就是将5的2进制向右移动2位。
5的2进制为
00000101
右移过后为
00000001
那么最后结果转为10进制为1。
这里需要注意的是在移动过后必然需要补位,补位的时候如果左边为0,那么久补0,如果为1,那么就补1。
<<(左移运算符)
左移运算符和右移运算符原理一样,只不过是向左移动。这里我们还是用5来举栗子。
5 << 2
5的2进制为
00000101
左移两位过后为
00010100
转换为10进制为20
上文中如果有错误欢迎大家指出。
网友评论