LeetCode 2220.转换数字的最少位翻转次数

一、题目

二、知识点(位运算)

符号

描述

运算规则

&

两位都为1结果为1

|

两位都为0结果为0

^

异或

两位相同为0不同为1

~

取反(非)

0变1,1变0

<<

左移

二进制位全部左移,高位丢弃,低位补0

>>

右移

二进制位全部右移,低位丢弃,高位补符号位

>>>

无符号右移

二进制位全部右移,低位丢弃,高位补0

左移和右移可以用来做乘除计算。右移和无符号右移的区别就在于负数的时候不一样。

三、解题

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;
            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、说明

无论哪种方案,归根结底都是通过位运算找到有多少个不同的位。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值