Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。

  PS:所有的位运算操作都是基于二进制补码进行的,干开发的都应该知道相关知识吧,我就不多哔哔。

  在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。  

<<(左移)

  按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。   

  语法格式   需要移位的数字 << 移位的次数
  例如:

System.out.println("'<<'位操作符(10 << 3):" + (10 << 3));

----------
输出结果
80

  首先把10转换为二进制数字0000 0000 0000 0000 0000 0000 0000 1010,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0010 1000,则转换为十进制是80.

  数学意义
  在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。 即:10*2^3=80

>>(右移)

  按二进制形式把所有的数字向右移动对应val位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1.
  语法格式  需要移位的数字 >> 移位的次数
  例如

System.out.println("'>>'位操作符(10 >> 3):" + (10 >> 3));
System.out.println("'>>'位操作符(-10 >> 3):" + (-10 >> 3));
---------- 输出结果 

  '>>'位操作符(10 >> 3):1 
  '>>'位操作符(-10 >> 3):-2

  10的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1010,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0001.转换为十进制是1.即:10/2^3 取整 1
  数学意义   右移一位相当于除2,右移n位相当于除以2的n次方。

>>>(无符号右移)

  按二进制形式把所有的数字向右移动对应val位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。

System.out.println("'>>>'位操作符(-10 >>> 3):" + (-10 >>> 3));
System.out.println("'>>>'位操作符(10 >>> 3):" + (10 >>> 3));
------------ 输出结果:

  '>>>'位操作符(-10 >>> 3):536870910
  '>>>'位操作符(10 >>> 3):1

  对-10右移三位的过程为:舍弃二进制数的最后三位,在二进制数的开头增加三个0,导致原来的符号位由‘1’变成了‘0’,由负数变成了正数;

  -10的二进制原码: 1000  0000  0000  0000  0000  0000  0000 1010,

        反码:1111  1111  1111  1111  1111  1111  1111  0101

        补码:1111  1111  1111  1111  1111  1111  1111  0110

  补码右移三位后  ‭0001 1111  1111  1111  1111  1111  1111  1110,转换成十进制 536870910

& (与运算符)

  与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值都是 1,则结果值相应的 bit 就是 1,否则为 0.  

  0 & 0 = 0,

  0 & 1 = 0,

  1 & 1 = 1
System.out.println("'&'位操作符(10 & 3):" + (10 & 3));

---------
输出结果:
'&'位操作符(10 & 3):2

|(或运算符)

  与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值只要 1 个为 1,则结果值相应的 bit 就是 1,否则为 0。

    0 | 0 = 0,

    0 | 1 = 1,

    1 | 1 = 1
System.out.println("'|'位操作符(10 | 3):" + (10 | 3));

----------
输出结果:
  '|'位操作符(10 | 3):11

~ (取反运算符)

  对操作数的每一位进行操作,1 变成 0,0 变成 1。 

System.out.println("'~'位操作符(~ 10):" + (~10));
System.out.println("'~'位操作符(~ -10):" + (~-10));
---------- 
输出结果:
  '~'位操作符(~ 10):-11
  '~'位操作符(~ -10):9

  10的二进制原码  0000  0000  0000  0000  0000  0000  0000  1010  反码,补码 同

      ~取反操作后:1111  1111  1111  1111  1111  1111  1111  1111  0101   补码

      反码: 1111  1111  1111  1111  1111  1111  1111  1111  0100

      原码:1000  0000  0000  0000  0000  0000  0000  1011   即  -11  

  个人猜想:N进行取反操作的结果是不是 -N-1????     

^ (异或运算符)

  两个操作数进行异或时,对于同一位上,如果数值相同则为 0,数值不同则为 1。

System.out.println("'^'位操作符(10^3):"+(10^3));

System.out.println("'^'位操作符(9^3):"+(9^3));

System.out.println("'^'位操作符(9^10):"+(9^10));

-------------
输出结果:
'^'位操作符(10^3):9
'^'位操作符(9^3):10
'^'位操作符(9^10):3

相信从这个例子,你们也应该看明白异或操作的规律了吧。

小结   

二进制运算符,包括位运算符和移位运算符,使程序员可以在二进制基础上操作数字,可以更有效的进行运算,并且可以以二进制的形式存储和转换数据,是实现网络协议解析以及加密等算法的基础。

Java中的位运算符的更多相关文章

  1. Java中的位运算符、移位运算

    一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&)  :两位全为1,结果为1,否则为0: (2)按位或  (|)   :两位有一个为1,结果为1,否则为0: (3) ...

  2. Java中的位运算符 &、|、^、~、<< 和 >>

    一.& 按位与运算符 5 & 3 = 1 5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101 3转换为二进制:0000 0000 0000 ...

  3. Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)

    Java 逻辑运算符.位运算符.移位操作符  总结     作者:王可利(Star·星星) 逻辑运算符,表格如下: 解析逻辑运算符表: 1.与 (&) 特点:两个都为真的时候,结果为真.两个为 ...

  4. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  5. Java中的移位运算符

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  6. java中的移位运算符:<<,>>,>>>总结(转)

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  7. 【java编程】java中的移位运算符

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  8. Java学习路线:Java中的位移运算符介绍

    学习java本来就是一件日积月累的事情,或许你通过自学能掌握一些皮毛技术,学到java的一些基本大面,但想要做到精通,还是需要自己技术的日积月累和工作经验的不断积累. 今天给大家分享的技术知识是:ja ...

  9. [java基础] 002 - 位运算符的详解和妙用

    一:位运算符详解 位运算符主要用来对操作数二进制的位进行运算.按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值. Java 语言中的位运算符分为位逻辑运算符和位移运算符两类, ...

随机推荐

  1. 51 Nod 1256 乘法逆元(数论:拓展欧几里得)

    1256 乘法逆元  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K ...

  2. python之字符编码

    1.以什么编码存的就以什么编码取出; 内存固定使用unicode编码; 我们可以控制的编码是往硬盘存放或者基于网络传输选择编码. 2.数据是最先产生于内存中,是unicode格式,要想传输需要转成by ...

  3. pandas之whl格式安装

    一.主要介绍linux下安装 1.下载安装包:https://pypi.doubanio.com/simple/pandas/ 2.安装  pip install wheel 3.更新一下pip版本( ...

  4. Django目录结构分析

    Django目录结构分析: Django的Linux项目目录记录 [root@cmdb Django]# tree mysite mysite ├── cmdb │   ├── admin.py # ...

  5. MVC 添加JS,CSS等版本标签

    在cshtml文件标签中添加 asp-append-version="true" <img src="~/images/codedigestlogo.png&quo ...

  6. 【回顾】html属性、标题、段落、文本格式化

    1.HTML 属性 HTML 元素可以设置属性 属性可以在元素中添加附加信息 属性一般描述于开始标签 属性总是以名称/值对的形式出现,比如:name="value". HTML 提 ...

  7. LVM分区无损增减

    http://www.361way.com/change-lvm-size/1792.html

  8. idea maven项目打war包 以及项目重新部署

    第一步 打war包: 这样war报就在你项目的target目录下: 第二步 部署步骤 首先进入服务器tomcat  bin 目录 关闭服务 命令:  ./shutdown.sh 然后就要进入webap ...

  9. Codeforces 1144G Two Merged Sequences dp

    Two Merged Sequences 感觉是个垃圾题啊, 为什么过的人这么少.. dp[ i ][ 0 ]表示处理完前 i 个, 第 i 个是递增序列序列里的元素,递减序列的最大值. dp[ i ...

  10. Codeforces 442D Adam and Tree dp (看题解)

    Adam and Tree 感觉非常巧妙的一题.. 如果对于一个已经建立完成的树, 那么我们可以用dp[ i ]表示染完 i 这棵子树, 并给从fa[ i ] -> i的条边也染色的最少颜色数. ...