看hashmap源码的时候,其中一个indexfor方法让我大开眼界,取下标的操作实在太骚了,然后又看到一个面试题
13 & 17 结果是什么?
让我对Java里的运算符起了点兴趣,特此记录一下
要了解运算符首先得了解二进制,只记录一下我的理解
首先看下1到10对应的二进制是多少吧
1 = 1
2 = 10
3 = 11
4 = 100
5 = 101
6 = 110
7 = 111
8 = 1000
9 = 1001
10= 1010
原先不知道怎么快速算出二进制,查过资料以后,发现原来是很简单的一个原理:除2取余
比如 5,计算过程如下:
5/2 = 2……1
2/2 = 1……0
1/2 = 0……1
最后结果就是101
再随便举个例子
比如137,计算过程如下:
137/2 = 68……1
68/2 = 34……0
34/2 = 17……0
17/2 = 8……1
8/2 = 4……0
4/2 = 2……0
2/2 = 1……0
1/2 = 0……1
所以最后结果就是 1000 1001
挺有意思的几个规律 :第一位肯定是1,最后一位就看奇数偶数了,奇数为1,偶数为0
还有很重要的一点 高位补0,二进制是有位数的,8位,16位,32位……
比如1,上面说过 他的二进制是1,那完整的二进制其实是 0000 0001,前7位算高位,是需要补上0的
再讲一下二进制转十进制
比如13,转化过程如下:
13 : 1 1 0 1
2³ 2² 2¹ 2º
8 + 4 + 0 + 1 = 13
好了 这下二进制的就了解完了,还没看懂的话,建议用纸跟笔亲自算一下,很容易理解的
现在开始将位运算符
1.& 与运算
与运算的规则是 两者都为1时,才为1,否则为0
就拿开头的13&17来举例吧:
13的二进制为 1101
17的二进制为 10001
13 : 1 1 0 1
17 :1 0 0 0 1
& :0 0 0 0 1
所以结果就是1
2.| 或运算
或运算的规则是 两者有1个为1,那就是1,否则为0
还拿13 17来举例:
13 : 1 1 0 1
17 :1 0 0 0 1
| :1 1 1 0 1
结果为 11101,转换为十进制 那就是1+4+8+16= 29
3.~ 非运算
非运算的规则是 如果位为0,结果是1,如果位为1,结果是0
比如13:
13 : 0 0 0 0 1 1 0 1
~ : 1 1 1 1 0 0 1 0
结果为1111 0010 转换为十进制 那就是 0+2+0+0+16+32+64+128 = 242
4.^异或运算
异或运算的规则是:两者相同则为0,不同则结果为1
照旧 13^17:
13 : 1 1 0 1
17 : 1 0 0 0 1
^ : 1 1 1 0 0
结果为 11100,转换为十进制 那就是 0+0+4+8+16=28