`
younglibin
  • 浏览: 1214445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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的移位运算

    位或运算符“|”只要有一个操作数在相应位上是1,结果位就为1,42(00101010)与15(00001111)按位或得到47(00101111)。 **按位异或(XOR)**: 位异或运算符“^”只有当两个操作数在相应位上的值不同时结果才为...

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

    位运算包括移位(左移、右移、无符号右移)、位与(&)、位或(|)、位异或(^)以及位非(~)。这些运算符在处理二进制数据、优化计算效率以及进行位级逻辑操作时非常有用。下面我们将详细解释这些运算符的工作原理...

    Java中的位运算

    - **按位或(|)**:如果两个相应位中有任意一位为1,则结果位为1;否则为0。 - **按位异或(^)**:如果两个相应位不同,则结果位为1;否则为0。 - **按位取反(~)**:将每个位取反,即0变1,1变0。 - **左移位...

    Java 中的位运算

    - **按位或 (`|`)**:对两个二进制数进行按位或操作,只要有一个相应位为1,结果就为1。 - 示例:`5 | 3 = 7` - `5` 的二进制表示为 `00000000000000000000000000000101`,`3` 的二进制表示为 `...

    java位运算.docx

    - 逻辑或运算符(|):按位或,两个位中有一个为1时结果就为1。 - 逻辑异或运算符(^):按位异或,两个位相同结果为0,不同结果为1。 在实际编程中,位运算常用于优化性能,特别是在需要高效处理数组或集合的元素...

    java位运算大全.pdf

    首先,位运算的基本操作包括按位与(&)、按位或(|)、按位异或(^)和按位取反(~)。按位与运算符(&)对两个数的每一位进行比较,只有当两个相应的位都为1时结果位才为1,否则为0。按位或运算符(|)则是只要两个相应的位有...

    java 位运算知识

    Java 位运算是编程语言中的一种底层操作,它允许我们直接对整数类型的数据进行按位操作,包括按位与(&)、按位或(|)、按位异或(^)、按位非(~)以及左移()、右移(&gt;&gt;)和无符号右移&gt;&gt;&gt;。这些操作在处理二进制数据、优化...

    java位运算1.pdf

    - `|`:按位或,两个位中至少有一个为1时结果为1。 - `^`:按位异或,两个位相同为0,不同为1。 - **移位运算符**: - `左移位运算,向左移动指定位数,高位补0。 - `&gt;&gt;`:有符号右移位,向右移动指定位数,...

    异或运算

    - **循环移位**:通过异或运算,可以实现数据的循环左移(A &lt;&lt; n XOR A &gt;&gt; (bit_count-n))和循环右移(A &gt;&gt; n XOR A (bit_count-n))。 - **错误检测**:CRC(Cyclic Redundancy Check)校验码就是基于异或运算,...

    Java移位运算

    - **位运算符**:除了移位运算符外,Java还提供了按位与`&`、按位或`|`、按位异或`^`等位运算符,以及按位非`~`。 - **复合赋值运算符**:`&=`、`|=`、`^=`等可以用来简化代码,提高可读性。 通过以上的介绍,我们...

    java中的位运算.doc

    - **逻辑运算符** 包括`~`(按位取反)、`&`(按位与)、`|`(按位或)和`^(按位异或)`。 - **移位运算符** 包括`(左移位)、`&gt;&gt;`(有符号右移位)和`&gt;&gt;&gt;(无符号右移位)`。 - 左移位运算符`将左侧操作数向左移动指定位数,...

    Java位运算和逻辑运算的区别实例

    接下来是位运算符,包括`&`(按位与)、`|`(按位或)、`^`(按位异或)、`~`(按位非)、`(左移)、`&gt;&gt;`(有符号右移)和`&gt;&gt;&gt;`(无符号右移)。位运算符对整数类型的二进制表示进行操作: 1. **按位与 (`&`)** 和...

    java经典位运算实例宣贯.pdf

    }`或`(x+y)^y`,通过位移和异或运算找到x的符号位,然后与x异或以消除符号位。 6. **取模和位运算**: - `a % (2^n) == a & (2^n - 1)`,当a和2^n没有溢出时,可以将取模运算转换为位与运算。 7. **乘法和位运算...

    Java 中的位运算 .doc

    2. **按位或 (|)**: 对两个操作数的每个对应位执行OR操作,只要有一个位为1,结果位就为1。例如,5与3的结果为7(0000 0000 0000 0000 0000 0000 0000 0111)。 3. **按位非 (~)**: 对一个操作数的所有位取反,0变成...

    Java利用移位运算将int型分解成四个byte型的方法

    位运算是指对二进制数进行的操作,例如与运算(&)、或运算(|)、异或运算(^)等。在这里,我们使用了或运算(|)来将四个 byte 型的值合并成一个 int 型。 知识点 6:Java 中的数据类型 在 Java 中,有多种数据...

    Java位运算知识点详解

    按位运算有&、|、~、^四种运算符,分别表示与、或、非、异或。移位运算有、&gt;&gt;、&gt;&gt;&gt;三种运算符,分别表示左移、右移、无符号右移。 2.1 与运算(&) 与运算的规则是:转为二进制后,两位都为1,则结果为1,否则结果...

    JAVA中位运算符合移为运算符

    位运算符直接作用于整数类型的二进制表示,包括与(&)、或(|)、异或(^)、非(~)以及左移()和右移(&gt;&gt;、&gt;&gt;&gt;). 这些运算符在进行位级操作时非常有用,比如在位掩码、数据加密、优化算法等方面。 1. **与(&)**: 它执行逐...

    【IT十八掌徐培成】Java基础第02天-04.运算符-移位运算-逻辑运算.zip

    位运算符包括按位与(&)、按位或(|)、按位异或(^)和按位非(~)。这些运算符可以用来对二进制位进行逐位操作,从而实现诸如设置或清除特定位、交换变量等复杂操作。 总之,理解和熟练运用Java中的移位运算和...

    java实现大周期线性反馈移位寄存器

    它首先从`start`字符串中提取出位0、4、10和13,然后通过异或(^)运算生成新的位13(`x13`)。这个异或操作相当于执行了LFSR的线性反馈函数。接着,`start_buffer`用于更新寄存器状态,移除最左边的一位并添加新...

Global site tag (gtag.js) - Google Analytics