这是我参与更文挑战的第11天,活动详情查看: 更文挑战
相信很多新人兄弟们或多或少有了解过位运算的概念, 但在实际业务开发中却很少使用
本文笔者将总结各位大神提供的位运算应用技巧
不求多专业, 但求能在代码中应用上
介绍
学术性的概念不再赘述, 各位可以暂时将位运算理解为二进制上每一位的计算
要想理解并使用位运算, 我们需要如下技能:
- 将十进制转换为二进制
- 熟识位运算符
方案
假设我们存在两个变量, height = 181
和weight = 76
十进制转二进制
将height转换为二进制, 具体步骤如下:
- 181除以2, 商为90, 余数为1
- 90除以2, 商为45, 余数为0
- 45除以2, 商为22, 余数为1
- 22除以2, 商为11, 余数为0
- 11除以2, 商为5, 余数为1
- 5除以2, 商为2, 余数为1
- 2除以2, 商为1, 余数为0
- 1除以2, 商为0, 余数为1
从下向上读取余数, height二进制结果为10110101
过程可以总结为, 使用数据除以2, 之后一直使用商继续除以2, 直到商为0, 将余数反向排列即为二进制结果
利用<<
和>>
进行乘除2
当我们会用二进制后, 这个操作就非常直观了
<<
为左移操作, 二进制向左移动, 数据自然是变大(相当于乘2): weight << 1 = 152
>>
为右移操作, 正好相反: height >> 1 = 90
使用^
实现变量交换
首先明确两个概念:
- 任何二进制
^
自身, 都等于0000000...
- 任何二进制
^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)互换的这种事情, 会没有女朋友的