前言
今天突然有一个需求用到了位运算符,然后让我好好的回忆了一下java基础,说实话我真的把位运算符的相关方法忘的死死的。所以为了纪念逝去的时光,写下了这篇基础中的基础,也算是给自己提个醒要时不时的去回去看看基础,要不然都没有进步的空间了。
正文
基础的东西基本上都是看一眼就能想起来的。比如下边这一眼。
位运算符的列表:
名称 | 符号 | |
左移 | << | 空位补0,被移除的高位丢弃,空缺位补0。 |
右移 | >> | 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。 |
无符号右移 | >>> | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
按位与 | & | 二进制位进行&运算,只有1&1时结果是1,否则是0; |
按位或 | | | 二进制位进行 |
按位异或 | ^ | 相同二进制位进行 ^ 运算,结果是0; 1^ 1=0 , 0^ 0=0不相同二进制位 ^ 运算结果是1。 1^ 0=1 , 0^1=1 |
按位取反 | ~ | 正数取反,各二进制码按补码各位取反。负数取反,各二进制码按补码各位取反 |
分开来解释如下:
左移
右移
无符号右移
按位与
按位或
按位异或
按位取反
这是因为整数在计算机中是二进制存储的。
java中 ~5=-6 ,而这个-6是输出到屏幕上,我们看到的是-6。
首先看对5求反,
5的二进制原码是:0000 0000 0101,
取反之后是:1111 1111 1010 ,得到的这个值在计算机中的存储原型也是 1111 1111 1010,而要把这个结果显示出来,到计算机屏幕上就要转换成十进制,也就是说 1111 1111 1010 是补码形式,
补码 = 原码取反 + 1。
补码要换算成对应的十进制就是
原码取反 = 补码 -1
所以1111 1111 1010 - 1 = 1111 1001, 然后再对1111 1111 1001 取反,得到 1000 0000 0110,
所以 原码就是 1000 0000 0110,对应的十进制就是 -6。
同样的,这样看也行:
-6在计算机中的存储为二进制补码形式,也就是说-6的补码是 1000 0000 1010 (-6的二进制原码是:1000 0000 0110,源码取反之后是 1111 1111 1001,再加上1就是 1111 1111 1010,这就是补码了)。
结束
本来感觉这篇文章应该是个水文,可是写到最后感觉没有那么简单,所以又重新把,反码,补码的相关内容看了一遍,(ps:真心不想看的,可谁知道这个按位取反给我整懵了呢【捂脸哭】)。总的来说这个逻辑还是很重要的。所以计算机组成原理,早就不知道让我给忘到哪去了。