Java中巧用位运算

863 阅读2分钟

这是我参与更文挑战的第11天,活动详情查看: 更文挑战

相信很多新人兄弟们或多或少有了解过位运算的概念, 但在实际业务开发中却很少使用

本文笔者将总结各位大神提供的位运算应用技巧

不求多专业, 但求能在代码中应用上

介绍

学术性的概念不再赘述, 各位可以暂时将位运算理解为二进制每一位的计算

要想理解并使用位运算, 我们需要如下技能:

  • 将十进制转换为二进制
  • 熟识位运算符

方案

假设我们存在两个变量, height = 181weight = 76

十进制转二进制

将height转换为二进制, 具体步骤如下:

  1. 181除以2, 商为90, 余数为1
  2. 90除以2, 商为45, 余数为0
  3. 45除以2, 商为22, 余数为1
  4. 22除以2, 商为11, 余数为0
  5. 11除以2, 商为5, 余数为1
  6. 5除以2, 商为2, 余数为1
  7. 2除以2, 商为1, 余数为0
  8. 1除以2, 商为0, 余数为1

从下向上读取余数, height二进制结果为10110101

过程可以总结为, 使用数据除以2, 之后一直使用商继续除以2, 直到商为0, 将余数反向排列即为二进制结果

利用<<>>进行乘除2

当我们会用二进制后, 这个操作就非常直观了

<<为左移操作, 二进制向左移动, 数据自然是变大(相当于乘2): weight << 1 = 152

>>为右移操作, 正好相反: height >> 1 = 90

使用^实现变量交换

首先明确两个概念:

  1. 任何二进制^自身, 都等于0000000...
  2. 任何二进制^00000..., 都等于自身

所以, 我们要交换height和weight:

height ^= weight
weight ^= height
height ^= weight

这么写可能比较复杂, 我们展开一下:

height = height ^ weight = 181 ^ 76
weight = weight ^ height = 76 ^ (181 ^ 76) = 76 ^ 76 ^ 181 = 181
height = height ^ weight = (181 ^ 76) ^ 181 = 181 ^ 181 ^ 76 = 76

看着上面的展开运算, 在看一开始明确的两个概念, 是不是思路很清晰了呢?

使用&判断奇偶

还是来看二进制, 二进制的奇偶很容易, 看最后一位是否为1即可

所以, 我们可以用这种方式判断:

if (0 == (height & 1)) {
    // 这是偶数
} else {
    // 这是奇数
}

总结

在现实生活中千万不要干身高(height)和体重(weight)互换的这种事情, 会没有女朋友的