`

Java中的位运算 (转)

阅读更多

 

Java的位运算(bitwise operators )直接对整数类型的位进行操作,这些整数类型包括longintshortchar

  byte,位运算符具体如下表:

 

运算符

说明

<< 

左移位,在低位处补0

>> 

右移位,若为正数则高位补0,若为负数则高位补1

>>> 

无符号右移位,无论正负都在高位补0

&

与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0

|

或(OR),对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1

~

非(NOT),一元运算符。

^

异或(XOR),对两个整型操作数中对应位执行布尔代数,两个位相等0,不等1

<<=

左移位赋值。

>>=

右移位赋值。

>>>=

无符号右移位赋值。

&=

按位与赋值。

|=

按位或赋值。

^=

按位异或赋值。

左移位(<<

程序:

public class LeftMoving{

    public static void main(String[] args){

           System.out.println("5<<3="+(5<<3));

    }

}

输出结果:

5<<3=40

计算过程:

0000 0000 0000 0000 0000 0000 0000 0101          ? 5

0000 0000 0000 0000 0000 0000 0010 1000          ? 40

右移位(>>

正数

程序:

public class PlusRightMoving{

    public static void main(String[] args){

           System.out.println("5>>1="+(5>>1));

    }

}

输出结果:

5>>1=2

计算过程:

0000 0000 0000 0000 0000 0000 0000 0101          ? 5

0000 0000 0000 0000 0000 0000 0000 0010          ? 2

负数

程序:

public class NegativeRightMoving{

    public static void main(String[] args){

           System.out.println("-5>>1="+(-5>>1));

    }

}

输出结果:

-5>>1=-3

计算过程:

1111 1111 1111 1111 1111 1111 1111 1011          ? -5

1111 1111 1111 1111 1111 1111 1111 1101          ? -3

无符号右移位(>>>

程序:

public class UnsignedRightMoving{

    public static void main(String[] args){

           System.out.println("-5>>>1="+(-5>>>1));

    }

}

输出结果:

-5>>>1=2147483645

计算过程:

1111 1111 1111 1111 1111 1111 1111 1011          ? -5

       0111 1111 1111 1111 1111 1111 1111 1101          ? 2147483645



首先复习一下Java中的基本数据类型的相关知识。

数据类型

大小

最小值

最大值

boolean

 

 

 

byte

8-bit

-128

+127

char

16-bit

Unicode 0

Unicode 216-1

short

16-bit

-215

+215-1

int

32-bit

-231

+231-1

float

32-bit

IEEE754

IEEE754

long

64-bit

-263

263-1

double

64-bit

IEEE754

IEEE754

void

 

 

 

这里包括了floatdouble两个浮点型,在本文中对其不予考虑,因为位运算是针对整型的。进行位操作时,

long型外,其他类型会自动转成int型,转换之后,可接受右操作数长度为32。进行位运算时,总是先将短整型

和字节型值转换成整型值再进行移位操作的。

程序:

public class ByteLeftMoving{

public static void main(String[] args){

    byte b = 127;

           System.out.println("b<<3="+(b<<3));

        System.out.println("(byte)(b<<3)="+(byte)(b<<3));

    }

}

输出结果:

b<<3=1016

(byte)(b<<3)=-8

程序:

public class CharLeftMoving{

public static void main(String[] args){

        char c = 'l';

           System.out.println("c<<3="+(c<<3));

        System.out.println("(char)(c<<3)="+(char)(c<<3));

    }

}

输出结果:

c<<3=864

(char)(c<<3)=?

以上两个例子全部编译通过,由此可以看出,当bytechar进行移位运算时不会发生错误,并且均按照整型进行

计算,当计算结果超出byte或是char所能表示的范围时则进行相应的转换(分别输出了结果-8?)。


位运算中的操作数

在进行移位运算时要注意整型和长整型在内存中的位数(整型是32位,长整型是64位),如果移位操作数超出

了该位数则取模计算,例如:int型数据是32位的,如果左移35位是什么结果?

程序:

public class LeftMoving{

    public static void main(String[] args){

           System.out.println("5<<35="+(5<<35));

    }

}

输出结果:

5<<35=40 

该结果与5<<3完全相同。

 

无论正数、负数,它们的右移、左移、无符号右移 32 位都是其本身,比如 -5<<32=-5-5>>32=-5

-5>>>32=-5

一个有趣的现象是,把 1 左移 31 位再右移 31 位,其结果为 -1

计算过程如下:

0000 0000 0000 0000 0000 0000 0000 0001

1000 0000 0000 0000 0000 0000 0000 0000

1111 1111 1111 1111 1111 1111 1111 1111

 

位运算要求操作数为整数,操作数不能是字符串也不能是小数。

如下列程序:

public class BitMath{

    public static void main(String[] args){

        String s = "Hello";

        long l = 99;

        double d = 1.11;

        int i = 1;

        int j = 0;

 

        System.out.println("j<<s="+j<<s);    //编译错误语句

        System.out.println("j<<d="+j<<d);    //编译错误语句

        System.out.println("i<<j="+i<<j);    //编译可以通过

        System.out.println("i<<l="+i<<l);    //编译可以通过

    }

}



由于位运算是二进制运算,不要与一些八进制数搞混,java中二进制数没有具体的表示方法。

public class BitMath{

    public static void main(String[] args){

        System.out.println("010|4="+(010|4));

    }

}

输出结果:

010|4=12

计算过程:

0000 0000 0000 0000 0000 0000 0000 1000    ?8

0000 0000 0000 0000 0000 0000 0000 0100    ?4

进行“或”计算结果为:

0000 0000 0000 0000 0000 0000 0000 1100    ?12

当位运算中遇见负数,必须把它转成补码(不知道什么是补码的补习功课去)再进行计算,而不是使用原码。

程序:

public class BitMath{

    public static void main(String[] args){

        try {

            int x = -7;

            System.out.println("x>>1="+(x>>1));

} catch(Exception e) {

            System.out.println("Exception");

        }

    }

}

输出结果:

x>>1=-4

计算过程:

1111 1111 1111 1111 1111 1111 1111 1001    ?-7

1111 1111 1111 1111 1111 1111 1111 1100    ?-4

public class BitMath{

    public static void main(String[] args){

        int i = 1;

        int j = -1;

        System.out.println("1>>>31="+(i>>>31));

        System.out.println("-1>>31="+(j>>31));

    }

}

输出结果:

1>>>31=0

-1>>31=-1

程序:

public class BitMath{

    public static void main(String[] args){

        int a = 1;

       a <<= 31;

        a >>= 31;

        a >>= 1;       

        System.out.println("a="+a);

 

        int b = 1;

        b <<= 31;

        b >>= 31;

        System.out.println("b="+b);

 

        int c = 1;

        c >>= 31;

        c <<= 31;

        System.out.println("c="+c);

    }

}

输出结果:

a=-1

b=-1

c=0

计算过程:

0000 0000 0000 0000 0000 0000 0000 0001    ?a=1

1000 0000 0000 0000 0000 0000 0000 0000    ?a=a<<31后,这里被当作是负数

1111 1111 1111 1111 1111 1111 1111 1111    ?a=a>>31后,结果为-1

1111 1111 1111 1111 1111 1111 1111 1111    ?a=a>>1后,结果仍为-1

 

0000 0000 0000 0000 0000 0000 0000 0001    ?c=1

0000 0000 0000 0000 0000 0000 0000 0000    ?c=c>>31后为0

0000 0000 0000 0000 0000 0000 0000 0000    ?0左移31位仍为0

分享到:
评论

相关推荐

    Java中的位运算

    Java的位运算

    JAVA位运算.pdf

    JAVA位运算.pdf ,深入了解java位运算

    位运算课件(java学习位运算课件)

    学习java编程,位运算的课件不好找。赶快下啊,系统的有根据的,美!!

    java 位运算知识点

    位运算在Java中的应用包括但不限于: - **高效计算**:例如,通过位运算快速判断一个数是否为2的幂,只需检查其二进制表示中是否只有一个1(即n & (n - 1) == 0)。 - **存储和提取位标志**:位运算常用于位标志...

    java位运算大全.doc

    Java中的位运算是一种高效的操作,它是直接针对二进制位进行操作,因此在处理特定问题,如加密算法和图形算法时,位运算可以提供较高的性能。在Java中,位运算符包括右移(&gt;&gt;&gt;),左移(),无符号右移(&gt;&gt;),按位与(&),按位...

    java位运算操作

    Java位运算操作 左位移 右位移 与或非的操作

    十六进制字符串按位异或运算工具和java位异或运算

    本节将详细介绍十六进制字符串的按位异或运算以及如何在Java中实现这一运算。 十六进制字符串是由0到9和A到F(或a到f)组成的字符序列,每个字符代表4位二进制数。例如,十六进制数"AB"在二进制下表示为10101011。...

    20191220-Java位运算_java_位运算_

    Java位运算在编程中是一种非常基础且强大的操作,它直接作用于二进制位,能够进行高效的数值处理和数据操作。本文将深入讲解Java中的位运算,并通过雪花算法的应用实例来进一步阐述其重要性和用法。 1. **位运算...

    java位运算,符号运算 详细解释

    Java位运算是一种底层操作,它直接作用于二进制位,是计算机科学中的基础操作。在Java编程中,位运算可以用于高效地处理数据,尤其是在处理数组、位集或者进行低级优化时非常有用。本篇文章将深入探讨Java中的位运算...

    Java 中的位运算 .doc

    Java 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .doc

    Java 中的位运算

    总结了一些关于,Java中常用位运行,希望能够帮助大家!

    java位运算例子,绝对有用

    java位运算例子,一看就懂,包含符号介绍,每个符号都有相应的例子。

    java位运算

    Java位运算是一种在计算机科学中广泛使用的操作,它涉及到对二进制位的直接操作,包括按位与、按位或、按位异或、按位非、左移、右移以及无符号右移等。这些操作对于理解底层计算原理、优化代码性能以及在特定场景下...

    Java位运算的应用

    (11)取模运算转化成位运算 (在不产生溢出的情况下) a % (2^n) 等价于 a & (2^n - 1) (12)乘法运算转化成位运算 (在不产生溢出的情况下) a * (2^n) 等价于 a (13)除法运算转化成位运算 (在不产生溢出的情况下) ...

    java二进制运算器(加、见、乘、除)

    在Java中,可以将每个二进制位视为一个独立的乘法运算,然后将结果组合起来。 5. **二进制除法**: 二进制除法稍微复杂一些,通常涉及多次右移(&gt;&gt;&gt;运算符)和与运算(&)来模拟长除法的过程。每次右移相当于除以2,...

    java位运算.docx

    java位运算.docxjava位运算.docxjava位运算.docxjava位运算.docx

    Java位操作工具类

    经常项目中用到的Java的位运算相关的方法,稍微整理了下 详细介绍可参考博客 http://longshaojian.iteye.com/admin/blogs/1946865 请多指教!

    Java生成算数运算中文图片验证码

    Java生成算数运算中文图片验证码的实现,结合了编程语言、图像处理和安全验证的多种技术,为用户提供了一种既安全又友好的验证方式。下面我们将深入探讨这个主题。 首先,验证码的核心是生成随机的算数运算表达式。...

    java 位运算知识

    - **处理掩码和标志**:在位运算中,掩码常用于检查或设置特定状态位,比如在操作系统内核或并发编程中。 - **数据编码和解码**:例如,将颜色信息编码到像素值中,或从像素值中提取颜色信息。 - **加密算法**:位...

    java.四则运算器

    在四则运算中,根据输入的数字类型,可能需要进行类型转换,例如将`int`转换为`double`以执行精确的浮点运算。 接下来,我们将探讨运算符的使用。在Java中,加法运算符是`+`,减法是`-`,乘法是`*`,除法是`/`。...

Global site tag (gtag.js) - Google Analytics