`

Java 位运算(移位、位与、或、异或、非)

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

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

1、左移( << )

Test1、将5左移2位:

[java]

package com.xcy;

 

public class Test {

   public static void main(String[] args) {

       System.out.println(5<<2);//运行结果是20

   }

}

运行结果是20,但是程序是怎样执行的呢?

首先会将5转为2进制表示形式(java中,整数默认就是int类型,也就是32位):

0000 0000 0000 0000 0000 0000 0000 0101           然后左移2位后,低位补0:

0000 0000 0000 0000 0000 0000 0001 0100           换算成10进制为20

2、右移( >> ) ,右移同理,只是方向不一样罢了(感觉和没说一样)

[java]

System.out.println(5>>2);//运行结果是1

还是先将5转为2进制表示形式:

0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:

0000 0000 0000 0000 0000 0000 0000 0001

3、无符号右移( >>> )

我们知道在Java中int类型占32位,可以表示一个正数,也可以表示一个负数。正数换算成二进制后的最高位为0,负数的二进制最高为为1

例如  -5换算成二进制后为:

1111 1111 1111 1111 1111 1111 1111 1011   (刚开始接触二进制时,不知道最高位是用来表示正负之分的,当时就总想不通。。明明算起来得到的就是一个正数-_-)

我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:

[java]

package com.xcy;

 

public class Test {

   public static void main(String[] args) {

       System.out.println(5>>3);//结果是0

       System.out.println(-5>>3);//结果是-1

       System.out.println(-5>>>3);//结果是536870911

   }

}

我们来看看它的移位过程(可以通过其结果换算成二进制进行对比):

5换算成二进制: 0000 0000 0000 0000 0000 0000 0000 0101

5右移3位后结果为0,0的二进制为: 0000 0000 0000 0000 0000 0000 0000 0000        // (用0进行补位)

-5换算成二进制: 1111 1111 1111 1111 1111 1111 1111 1011

-5右移3位后结果为-1,-1的二进制为:

1111 1111 1111 1111 1111 1111 1111 1111   // (用1进行补位)

-5无符号右移3位后的结果 536870911 换算成二进制:

0001 1111 1111 1111 1111 1111 1111 1111   // (用0进行补位)

通过其结果转换成二进制后,我们可以发现,正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)

注意:笔者在这里说的是右移,高位补位的情况。正数或者负数左移,低位都是用0补。(自行测试)

 

4、位与( & )

[java]

package com.xcy;

 

public class Test {

   public static void main(String[] args) {

       System.out.println(5 & 3);//结果为1

   }

}

还是老套路,将2个操作数和结果都转换为二进制进行比较:

5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101

3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011

-------------------------------------------------------------------------------------

1转换为二进制:0000 0000 0000 0000 0000 0000 0000 0001

位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0

 

5、位或( | )

[java]

package com.xcy;

 

public class Test {

   public static void main(String[] args) {

       System.out.println(5 | 3);//结果为7

   }

}

5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101

3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011

-------------------------------------------------------------------------------------

7转换为二进制:0000 0000 0000 0000 0000 0000 0000 0111

位或操作:第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0

6、位异或( ^ )

[java]

package com.xcy;

 

public class Test {

   public static void main(String[] args) {

       System.out.println(5 ^ 3);//结果为6

   }

}

5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101

3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011

-------------------------------------------------------------------------------------

6转换为二进制:0000 0000 0000 0000 0000 0000 0000 0110

位异或:第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0

 

7、位非( ~ )           位非是一元操作符

[java]

package com.xcy;

 

public class Test {

   public static void main(String[] args) {

       System.out.println(~5);//结果为-6

   }

}

5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101

-------------------------------------------------------------------------------------

-6转换为二进制:1111 1111 1111 1111 1111 1111 1111 1010

位非:操作数的第n位为1,那么结果的第n位为0,反之。

 

由位运算操作符衍生而来的有:

&= 按位与赋值

|=  按位或赋值

^= 按位非赋值

>>= 右移赋值

>>>= 无符号右移赋值

<<= 赋值左移

和 += 一个概念而已。

举个例子:

[java] www.2cto.com

package com.xcy;

 

public class Test {

   public static void main(String[] args) {

       int a = 5

       a &= 3;

       System.out.println(a);//结果是1

   }

}

分享到:
评论

相关推荐

    Java中位运算(移位、位与、或、异或、非) 的简单实例

    Java中位运算(移位、位与、或、异或、非) 的简单实例,需要的朋友可以参考一下

    JAVA基础之java的移位运算

    位逻辑运算符有“与”(AND)、“或”(OR)、“异或(XOR )”、“非(NOT)”,分别用“&”、“|”、“^”、“~”表示,4-3 表显示了每个位逻辑运算的结果。在继续讨论之前,请记住位运算符应用于每个运算数内的每...

    java2入门经典.part01

    java2入门经典.part01 Java2入门经典 图书目录 译者序 序 前言 第一章:Java概述 什么是Java ...移位运算 按位运算的方法 有固定序列整型值的变量(枚举) 布尔型变量 运算符的优先级 程序注释 本章小结 ……

    Java2入门经典.rar

    译者序 序 前言 第一章:Java概述 什么是Java Java语言的特性 学习Java ava程序 学习Java要走的路 ...移位运算 按位运算的方法 有固定序列整型值的变量(枚举) 布尔型变量 运算符的优先级 程序注释 本章小结 ……

    Java byte 位移操作 注意事项

    & | ^ (加,减,乘,除,右移,左移,无符号右移,位与,位或,位异或)操作,均会是首先将byte转化为int, 再行运算。这一事实可能导致多种问题:  假设我们想进行如下byte运算: 1111 1000 右移1位,再与0000 ...

    Java运算符介绍.pptx.pptx

    Java运算符分类 Java运算符主要分为四类:算术运算符、关系运算符、逻辑运算符和位运算符,这些运算符...位运算符主要用于处理二进制数据,包括与、或、非、异或和移位等操作,它们可以实现对数据的快速处理和转换。

    Java大作业基于JavaSwing实现的模拟程序员计算器源码+项目说明.zip

    `已完成`实现与、或、异或、 `已完成`反码、补码和移位运算 `已完成`实现单一进制模式下的带括号的组合多步运算 `已完成`实现混合进制模式下带括号的组合多步运算 `已完成`设计运算溢出等出错提示。 备注 课题...

    整理后java开发全套达内学习笔记(含练习)

    进行高精度运算可以用java.math包中BigDecimal类中的方法。 自动类型提升又称作隐式类型转换。 强制类型转换:int ti; (byte) ti ; 强制转换,丢弃高位 宣告变量名称的同时,加上“final”关键词来限定,这个...

    微软JavaScript手册

    按位或运算符 (|) 对两个表达式指定按位或操作。 按位右移运算符 (&gt;&gt;) 将一个表达式的各位向右移,保持符号不变。 按位异或运算符(^) 对两个表达式执行按位异或操作。 blink 方法 将 HTML 的 &lt;BLINK&gt; 标识...

    javasnmp源码-network:软考中级网络工程师-学习笔记

    主要完成对二进制数据的算术运算(加减乘除),逻辑运算(与或非异或),以及移位操作 加法器/累加器: 是一个通用寄存器,为ALU提供一个工作区,用于传输和暂用户数据 数据缓冲寄存器: 用来存放由内存储器读出的一条...

    java8源码-Interview:对我的采访

    将高位数据移位到低位进行异或运算,因为这些数字差异主要在高位上,高位和低位取异或保留高位特征值,使其分布更随机 称其为扰动函数 tableSizeFor n |= n &gt;&gt;&gt; 4 即取最高位是1之后都是1的那个数,然后+1 变成 10000...

    javaSE代码实例

    3.7 移位运算 34 3.7.1 “”左移 35 3.7.2 “”右移 35 3.7.3 “”无符号右移 36 3.7.4 令人困扰的例子 37 3.8 赋值运算 37 3.8.1 普通赋值运算 37 3.8.2 运算赋值运算 38 3.9 括号及运算符间的...

    javalruleetcode-MyLeetcodeSolutions:我的Leetcode解决方案

    异或运算 慢指针和快指针 推电流最小值 不同的长度 不适用 指数为 1 的模数 Boyer-Moore 投票算法 不适用 不适用 小心循环/反转所有然后反转前后 一点一点/掩码和移位 不适用 不适用 不适用 不适用 设置和拉链 不...

Global site tag (gtag.js) - Google Analytics