位运算符详解(与,或,非,异或,<<,>>)

位运算符主要是以二进制规则进行运算

1.与(&)运算符

使用规则:两个二进制操作数对应位同为1 结果位 才为1,其余情况为0;
例如:整数 a = 15   整数 b = 127
计算:(a & b)

15 的二进制位:0000 1111
127 的二进制为:0111 1111

在这里插入图片描述
即:(a & b) = 15

2.或(|)运算符

使用规则:两个二进制操作数对应位只要有一个为1 结果位 就为1,其余情况为0;
例如:整数 b = 127   整数 c = 128
计算:(b | c)

127 的二进制位:0111 1111
128 的二进制位:1000 0000

在这里插入图片描述
即:(b | c) = 255

3.非(~)运算符

使用规则:一个二进制操作数,对应位为0,结果位为1;对应位为1,结果位为0;
作用是将每位二进制取反
例如:整数 d = 1
计算:(~d)
十进制 1 的二进制表示为:

0000 0001

每位都取反为:

1111 1110

这是内存中的保存形式。我们读取的十进制是根据原码来读取,而在内存中,数值都是以二进制补码形式存储的。正数的补码和原码一样,负数的补码得到过程:原码 转 反码 再转 补码

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
传送门:原码, 反码, 补码 详解

然后计算取反后的补码,其真值就是结果。
在这里插入图片描述
即:(~d) = -2

4.异或(^)运算符

使用规则:两个二进制操作数对应位相同为0,不同为1;
例如:整数 e = 2   整数 f= 3
计算:(e ^ f)

2 的二进制位:0000 0010
3 的二进制位:0000 0011

在这里插入图片描述

即:(e ^ f) = 1

5.移位运算符(<< 和 >>)

  移位运算符组成的表达式也属于算术表达式,其值为算术值。左移运算是将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。

5.1 左移(<<)运算符

按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
语法格式:需要移位的数字number << 移位的次数
例如:整数 g = 10
计算:g<<2

10 的二进制位:0000 1010

在这里插入图片描述
数学意义:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

5.2 右移(>>)运算符

按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
语法格式:需要移位的数字number >> 移位的次数
例如:整数 h = -7(这里只列出了计算负数的右移运算,正数运算高位直接补0就行了)
计算:h >> 2

在这里插入图片描述
  计算流程:首先将负数进行转换为反码 ——>补码,将转换为补码的负数的二进制形式向右位移,空出的高位全补符号位1,再将位移后的二进制操作数进行转换为反码 ——> 补码,通过补码计算出来的结果就是一个负整数位移后的结果。
数学意义:右移一位相当于除2,右移n位相当于除以2的n次方。

6.代码实现
public class Bitwise {
    public static void main(String[] args){
        int a = 15;
        int b = 127;
        int c = 128;
        int d = 1;
        int e = 2;
        int f = 3;
        int g = 10;
        int h = -7;
        int I = 10;
        System.out.println("a和b的 与运算 结果为:" + (a & b));
        System.out.println("b和c的 或运算 结果为:" + (b | c));
        System.out.println("d 非运算 的结果为:" + (~d));
        System.out.println("e和f 异或运算 的结果为: "  + (e ^ f));
        System.out.println("g 左移2位运算 的结果为: "  + (g << 2));
        System.out.println("h 右移2位运算 的结果为: "  + (h >> 2));
        System.out.println("I 右移1位运算 的结果为: "  + (I >> 1));
    }
}

运算结果:

a和b的 与运算 结果为:15
b和c的 或运算 结果为:255
d 非运算 的结果为:-2
e和f 异或运算 的结果为: 1
g 左移2位运算 的结果为: 40
h 右移2位运算 的结果为: -2
I 右移1位运算 的结果为: 5
  • 155
    点赞
  • 645
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值