基本位运算符、位移运算符、使用异或实现数据交换

目录

1. 基本位运算符

2. 位移运算符

3. 数据交换


1. 基本位运算符

位运算符指的是二进制位的运算,先将十进制数转换成二进制后再进行计算,在二进制中,1表示true,0表示false

  • 位与:&,遇false则false,遇0则0
  • 位或:|,遇true则true,遇1则1
  • 位异或:^,相同为false,不同为true。一个数,被另外一个数,异或两次,该数本身不变
  • 位取反:~,全部取反,0变1,1变0(包括符号位)

例如:System.out.println(~6); //结果:-7,

运算过程为:

  1. 6转换成二进制:00000000 00000000 00000000 00000110
  2. 全部取反:11111111 11111111 11111111 11111001
  3. 取反后的为负数,二进制数在计算机中是以补码形式运算,所以此时得到的应为补码形式
  4. 想获得对应十进制表示形式,就得从补码转换成原码
  5. 补码转反码:减1得到 11111111 11111111 11111111 11111000
  6. 反码变原码,除符号位,其余全部取反得到10000000 00000000 00000000 00000111
  7. 最高位是1,为负数。转换十进制为:-7

2. 位移运算符

有符号左移运算符:<<

  • 二进制位向左移动,左边符号位丢弃,右边补0

  • 运算规律:向左移动几位,就是乘以2的几次幂

  • System.out.println(12 << 1);   //结果:24 

  • System.out.println(-12<<1);    //结果:-24

有符号右移运算符:>>

  • 二进制位向右移动,使用符号位进行补位

  • 规律:向右移动几位,就是除以2的几次幂

  • System.out.println(4 >> 1);    //结果:2

无符号右移运算符:>>>

  • 无论符号位是0还是1,都补0

  • 会使负数变为正数,使用很少

  • System.out.println(-1 >>> 1);   分析过程:

  1.  -1转换成二进制:10000000 00000000 00000000 00000001(负数在计算机中用补码参与运算)
  2.  反码:11111111 11111111 11111111 11111110
  3. 补码:11111111 11111111 11111111 11111111
  4. 右移1位:01111111 11111111 11111111 11111111
  5. 右移之后,变成正数,正数的原码和补码一样,所以直接转换成十进制为:2147483647

3. 数据交换

方法一:引入第三方变量交换数据

int a = 1;
int b = 2;
int temp = a;
a = b;
b = temp;

方法二:使用异或^,一个数,被另外一个数异或两次,该数本身不变

int a = 10;
int b = 20;
a = a ^ b;// a = 10 ^ 20
b = a ^ b;// b = 10 ^ 20 ^ 20 = 10
a = a ^ b;// a = 10 ^ 20 ^ 10 = 20

 

如有错误欢迎留言评论,及时更正!  羽露风 5月14日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽露风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值