java位运算

概述

计算机是以二进制的补码来运算的

原码

符号位加上数字的二进制表示。二进制中最高位“0”表示正数(+),“1”表示负数(-)

反码

正数的反码和原码一样。负数的反码,除了符号位,其他的位数全部取反

补码

正数的补码和原码一样。负数的补码为反码 + 1

运算符

&:与运算(有0则0)
|:或运算(有1则1)
^:异或运算(相同则0,不同则1)
~:取反运算(0变1,1变0)
<<:左移(左边最高位丢弃,右边补齐0)
>>:右移(最高位是0,左边补齐0;最高为是1,左边补齐1)
>>>:无符号右移(无论最高位是0还是1,左边补齐0)

与运算

  00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100
  -----------------------------------
  00000000 00000000 00000000 00000000
结果是:0

或运算

  00000000 00000000 00000000 00000011
| 00000000 00000000 00000000 00000100
  -----------------------------------
  00000000 00000000 00000000 00000111
结果是:7

异或运算

  00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100
  -----------------------------------
  00000000 00000000 00000000 00000111
结果是:7

特点:一个数据对另一个数据位异或两次,该数本身不变

public static void main(String[] args) {
    int a = 10;
    int b = 20;
    System.out.println(a ^ b ^ b); //10
    System.out.println(a ^ b ^ a); //20
}

基于该特点可以做整数的交换,无需中间变量,数据也不会溢出整数范围,而且效率最快

public static void main(String[] args) {
    int a = 10;
    int b = 20;

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

    System.out.println(a); //20
    System.out.println(b); //10
}

取反运算

  00000000 00000000 00000000 00000011
~ 11111111 11111111 11111111 11111100 (补码)

  补码:11111111 11111111 11111111 11111100
  反码:11111111 11111111 11111111 11111011
  原码:10000000 00000000 00000000 00000100
结果是:-4

左移 右移 无符号右移

public static void main(String[] args) {
    //<< 把<<左边的数据乘以2的移动次幂
    System.out.println(3 << 2); //3*2^2 = 3*4 = 12;
    //>> 把>>左边的数据除以2的移动次幂
    System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6
    System.out.println(24 >>> 2);

    System.out.println(-24 >> 2); 
    System.out.println(-24 >>> 2);
}

/*解析:
    3 << 2:
    3的二进制:    00000000 00000000 00000000 00000011
    左移后:   (00)000000 00000000 00000000 0000001100

    -24 >> 2:   
    24的二进制:11000
        原码: 10000000 00000000 00000000 00011000
        反码: 11111111 11111111 11111111 11100111
        补码: 11111111 11111111 11111111 11101000

        右移后:1111111111 11111111 11111111 111010(00) 补码

        补码:1111111111 11111111 11111111 111010
        反码:1111111111 11111111 11111111 111001
        原码:1000000000 00000000 00000000 000110

        结果:-6

    -24 >>> 2:
        24的二进制:11000
        原码:10000000 00000000 00000000 00011000
        反码:11111111 11111111 11111111 11100111
        补码:11111111 11111111 11111111 11101000

        右移后:0011111111 11111111 11111111 111010(00)

        结果:...
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值