一、题目
二、知识点
符号 | 描述 | 运算规则 |
& | 与 | 两位都为1结果为1 |
| | 或 | 两位都为0结果为0 |
^ | 异或 | 两位相同为0不同为1 |
~ | 取反(非) | 0变1,1变0 |
<< | 左移 | 二进制位全部左移,高位丢弃,低位补0 |
>> | 右移 | 二进制位全部右移,低位丢弃,高位补符号位 |
>>> | 无符号右移 | 二进制位全部右移,低位丢弃,高位补0 |
- 左移和右移可以做乘除运算,例如除2可以右移一位。
- 右移和无符号右移的区别在于负数的时候不一样,>>负数的时候高位补1,>>>负数的时候高位补0。
三、解题
注:本文均是Java代码
1、方案一
class Solution {
public int minBitFlips(int start, int goal) {
// 二进制位有多少个不同
int result= 0;
int index = start ^ goal; // 相同为0,不同为1
// 计算变量中有多少个不同(即1),不同的个数就是最少翻转次数
while (index > 0) { // 一旦变量值等于0,后边不会有不同
result += index & 1; // 判断最后一位是0还是1,是什么就加什么
index = index >> 1; // 右移一位
}
return result;
}
}
2、方案二
class Solution {
public int minBitFlips(int start, int goal) {
// 二进制位有多少个不同
int result = 0;
for (int i = 0; i < 32; i++) {
// 判断第i位是0还是1
// int x = (start & (1 << i)) == 0 ? 0 : 1;
// int y = (goal & (1 << i)) == 0 ? 0 : 1;
// 可以不用三元运算符比较是0还是1,直接比就行(比的就是这一位上是什么)
int x = start & (1 << i);
int y = goal & (1 << i);
if (x != y) result++;
}
return result;
}
}
3、说明
无论采用哪种方案,归根结底都是通过位运算找到有多少个不同的位。
标签:右移,index,start,int,2220,二进制位,result,LeetCode,翻转 From: https://blog.csdn.net/qq_63939626/article/details/137352723