Java位运算

# 位运算操作符

位运算在Java中有四种,”与”,”或”,”非”,”异或”。看名字前三个我们应该已经大概知道是干嘛的了。异或的概念在这里说一下就好了。异或:两个输入相同时为0,不同则为1。来几个demo吧

真值表

aba&b
000
010
100
111
public static void andOpt() {
    int a = 4;
    int b = 7;
    System.out.println("a的二进制为:" + Integer.toBinaryString(a));
    //100
    System.out.println("b的二进制为:" + Integer.toBinaryString(b));
    //111
    System.out.println("a&b的二进制为:" + Integer.toBinaryString(a & b));
    //100
}

真值表

aba&b
000
011
101
111
public static void orOpt() {
    int a = 4;
    int b = 7;
    System.out.println("a的二进制为:" + Integer.toBinaryString(a));
    //100
    System.out.println("b的二进制为:" + Integer.toBinaryString(b));
    //111
    System.out.println("a|b的二进制为:" + Integer.toBinaryString(a | b));
    //111
}

真值表

a~a
01
10
public static void notOpt() {
    int a = 4;
    System.out.println("a的二进制为:" + Integer.toBinaryString(a));
    //100
    System.out.println("~a的二进制为:" + Integer.toBinaryString(~a));
    //1111 1111 1111 1111 1111 1111 1111 1011
}

在这里说明一下,为什么非的结果是这么多1。因为int在Java中是占有32位
即4的话应该是: 0000 0000 0000 0000 0000 0000 0000 0100
取非之后应该是:1111 1111 1111 1111 1111 1111 1111 1011

异或

真值表

aba&b
000
011
101
110
public static void andOpt() {
    int a = 4;
    int b = 7;
    System.out.println("a的二进制为:" + Integer.toBinaryString(a));//100
    System.out.println("b的二进制为:" + Integer.toBinaryString(b));//111
    System.out.println("a^b的二进制为:" + Integer.toBinaryString(a ^ b));//011
}

其实还有一个同或的概念,相同为1,不同为零

真值表

aba&b
001
010
100
111

左移和右移以及无符号右移

左移和右移的操作是指将这个数字转成二进制,进行移位的操作,如1左移两位,即001 -> 100,即1->4
4右移两位,即100->001 ,即1

public static void goRight() {
    int a = 1 << 2;
    System.out.println("1左移两位后:" + a);//4
}

public static void goLeft() {
    int a = 4 >> 2;
    System.out.println("4右移两位后:" + a);//1
}

计算机负数用补码表示,会把最高位当做符号位。有符号右移则判断符号位,正数则左边填零,负数则左边填一。无符号右移是指不管符号位,都往左边填零。我们可以看一下例子:

public static void goRightWithOutSym() {
    int a = -5;
    System.out.println("-5的二进制为: " + Integer.toBinaryString(a));
    //1111 1111 1111 1111 1111 1111 1111 1011
    System.out.println("-5右移两位: " + Integer.toBinaryString(a >> 4));
    //1111 1111 1111 1111 1111 1111 1111 1111
    System.out.println("-5无符号右移两位: " + Integer.toBinaryString(a >>> 4));
    //0000 1111 1111 1111 1111 1111 1111 1111
    int b = 5;
    System.out.println("5的二进制为: " + Integer.toBinaryString(b));
    //101
    System.out.println("5右移两位: " + Integer.toBinaryString(b >> 1));
    //010
    System.out.println("5无符号右移两位: " + Integer.toBinaryString(b >>> 1));
    //010
}

这里就有涉及计到了补码的相关知识

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值