栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中的位运算

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中的位运算

原码、反码、补码

正数:正数的原码、反码、补码都一样(三码合一)负数:负数的反码 = 它的原码除符号位外其他按位取反(0取1,1取0);负数的补码 = 它的反码 + 10的反码、补码都是0

特别说明:
1、java没有无符号数,java中的数都是有符号的
2、二进制数的最高位表示符号位,0表示正数,1表示负数
3、计算机中的运算都是以补码的方式来计算的,但我们看运算结果时要看原码

位运算符

java中有7个位运算符:&、|、^、~、>>、<<、>>>

按位与&:两位均为1,则结果为1,否则为0按位或|:两位中至少有一个为1,则结果为1,否则为0按位异或^:两位中一个为1,另一个为0,则结果为1,否则为0按位取反~:1变0,0变1算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位算术左移<<:符号位不变,低位补0逻辑右移>>>:也叫无符号右移,低位溢出,高位补0

特别说明:没有 “<<<” 这个位运算符

示例

以下示例均以 int 数据类型进行举例。
1、按位与&

2&3 => 2 
    00000000 00000000 00000000 00000010   //三码合一,直接运算
    00000000 00000000 00000000 00000011
    ————————————————————————————————————
    00000000 00000000 00000000 00000010   //正数,三码合一,2


-2&3 => 2
    10000000 00000000 00000000 00000010   //原码
    00000000 00000000 00000000 00000011

    11111111 11111111 11111111 11111101   //反码
    00000000 00000000 00000000 00000011

    11111111 11111111 11111111 11111110   //补码运算
    00000000 00000000 00000000 00000011
    ————————————————————————————————————
    00000000 00000000 00000000 00000010   //正数,三码合一,2

2、按位或|

2|3 => 3
    00000000 00000000 00000000 00000010   //三码合一,直接运算
    00000000 00000000 00000000 00000011
    ————————————————————————————————————
    00000000 00000000 00000000 00000011  //正数,三码合一,3


-2|3 => -1
    10000000 00000000 00000000 00000010   //原码
    00000000 00000000 00000000 00000011

    11111111 11111111 11111111 11111101   //反码
    00000000 00000000 00000000 00000011

    11111111 11111111 11111111 11111110   //补码运算
    00000000 00000000 00000000 00000011
    ————————————————————————————————————
    11111111 11111111 11111111 11111111   //负数补码
 => 11111111 11111111 11111111 11111110   //负数反码
 => 10000000 00000000 00000000 00000001   //负数原码,-1

3、按位异或^

2^3 => 1
    00000000 00000000 00000000 00000010   //三码合一,直接运算
    00000000 00000000 00000000 00000011
    ————————————————————————————————————
    00000000 00000000 00000000 00000001   //正数,三码合一,1
    

-2^3 => -3
    10000000 00000000 00000000 00000010   //原码
    00000000 00000000 00000000 00000011

    11111111 11111111 11111111 11111101   //反码
    00000000 00000000 00000000 00000011

    11111111 11111111 11111111 11111110   //补码运算
    00000000 00000000 00000000 00000011
    ————————————————————————————————————
    11111111 11111111 11111111 11111101   //负数补码
 => 11111111 11111111 11111111 11111100   //负数反码
 => 10000000 00000000 00000000 00000011   //负数原码,-3

4、按位取反~

~2 => -3
    00000000 00000000 00000000 00000010   //三码合一,直接运算
    ————————————————————————————————————
    11111111 11111111 11111111 11111101   //负数补码
 => 11111111 11111111 11111111 11111100   //负数反码
 => 10000000 00000000 00000000 00000011   //负数原码,-3


~-2 => 1
    10000000 00000000 00000000 00000010   //原码
 => 11111111 11111111 11111111 11111101   //反码
 => 11111111 11111111 11111111 11111110   //补码运算
    ————————————————————————————————————
    00000000 00000000 00000000 00000001   //正数,三码合一,1 

5、算术右移>>

1>>2 => 0
    00000000 00000000 00000000 00000001   //三码合一,直接运算
    ————————————————————————————————————
    00000000 00000000 00000000 00000000   //0的三码均为0


-1>>2 => -1
    10000000 00000000 00000000 00000001   //原码
 => 11111111 11111111 11111111 11111110   //反码
 => 11111111 11111111 11111111 11111111   //补码运算
    ————————————————————————————————————
    11111111 11111111 11111111 11111111   //负数补码
 => 11111111 11111111 11111111 11111110   //负数反码
 => 10000000 00000000 00000000 00000001   //负数原码,-1

6、算术左移<<

1<<2 => 4
    00000000 00000000 00000000 00000001   //三码合一,直接运算
    ————————————————————————————————————
    00000000 00000000 00000000 00000100   //正数,三码合一,4
    

-1<<2 => -4
    10000000 00000000 00000000 00000001   //原码
 => 11111111 11111111 11111111 11111110   //反码
 => 11111111 11111111 11111111 11111111   //补码运算
    ————————————————————————————————————
    11111111 11111111 11111111 11111100   //负数补码
 => 11111111 11111111 11111111 11111011   //负数反码
 => 10000000 00000000 00000000 00000100   //负数原码,-4 

7、逻辑右移>>>

3>>>2 => 0
    00000000 00000000 00000000 00000011   //三码合一,直接运算
    ————————————————————————————————————
    00000000 00000000 00000000 00000000   //0的三码均为0

补充说明:由于正数三码合一的原则,以及基于算术左移和右移的运算规则,我们不难发现,对于正数而言,进行算术右移即除以相应的2的指数幂,进行算术左移即乘以相应的2的指数幂。(日后可以采用这种方法进行快速运算。)

例如:
8>>2 = 8/4 = 2
8<<2 = 8×4 = 32
5>>1 = 5/2 = 2
5<<1 = 5×2 = 10

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/721811.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号