今天和同学讨论负数为什么要用补码表示,被嘲笑一波,说是计算机组成原理的基础知识,我尴尬不失礼貌的说,不好意思,我没有学计算机组成原理。当然了,没学不是借口,以前不会,碰到了,就要理解,记住。最近在刷LeetCode的时候,经常碰到位运算的题目,一开始是拒绝的,总是跳过跳过,我学习方法里面是有这个习惯,遇到不会的,我不想花时间去理解,去消灭它,我想这就是为什么我一直这么菜的原因吧。
回到正题。在java中,支持的位运算有如下七个。
1.&:按位与
2. |:按位或
3. ~:按位非
4.^按位异或
5.<<:左移运算符
6.>>右位运算符
7.>>>无符号右移运算符
对于&,都为1则为1,都为0则为0。对于|,有1就为1,对与^,两个相同则为0,不同为1
按位非只需要一个操作数,这个运算符是将操作数在计算机底层的2进制码按位取反
1.左移运算符是将运算数的二进制整体左移制定位数,左移后右边空出来的位以0来填充(对于5<<1,其实是可以理解5乘以2的)
2.java 的右移运算符右两个,>>和>>>,对于>>运算符而言,把第一个操作数的二进制右移指定位数。左边空出来的位以原来的符号来填充,如果第一个操作数是正数,则左边补0,如果第一个操作数,则左边补1,>>>是无符号运算符,它把第一个操作数的二进制右移指定位数后。左边空出来的总是以0来补充。如(5>>1),其实可以理为5/2.)