Java中& | ^ ~ 位运算

看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+32+64+128+256 = 482

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

 

你可能感兴趣的:(算法,java,编程语言,算法)