力扣每日一题 3226. 使两个整数相等的位更改次数

给你两个正整数 nk

你可以选择 n二进制表示 中任意一个值为 1 的位,并将其改为 0。

返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。

又是一个简单题,直接n和k转换成二进制然后算就可以了。

不过我们可以用位运算再提一下速度。

首先判断能否更改。可以用n&k计算。与是两个同为1则1否则为0,那么就应该是n&k=k

已经保证了所有k为1时n都为1,那么统计一下n和k有多少位不同就可以了。我们可以计算n^k中1的个数。如果还是转二进制计算的话那我们位运算就纯画蛇添足了。幸好即使是C/C++也有办法可以快速统计1的个数,那就是__builtin_popcount。(这种内建函数拥有硬件支持,比手动逐位计算更快。) 内建函数的实现依赖于编译器,可能是直接一句popcnt了事,也可能是其他各种方式实现计算。

objectivec 复制代码
int minChanges(int n, int k) {
    return (n & k) != k ? -1 : __builtin_popcount(n ^ k);
}

C语言的高光时刻,一行解决问题。同样的,C++也可以用。

再贴个python的

python 复制代码
class Solution:
    def minChanges(self, n: int, k: int) -> int:
        return -1 if n & k != k else (n ^ k).bit_count()

顺便补充几个内置的二进制操作函数

GCC 和 Clang 提供了几个内建的二进制操作函数,常用于位运算优化:

  1. **`__builtin_popcount(x)`**:计算整数 `x` 的二进制中"1"的个数。

  2. **`__builtin_clz(x)`**:计算 `x` 前导零的个数(未指定负数行为)。

  3. **`__builtin_ctz(x)`**:计算 `x` 尾随零的个数。

  4. **`__builtin_parity(x)`**:计算 `x` 的二进制中"1"的个数是否为奇数,返回 1 表示奇数个,0 表示偶数个。

这些函数支持 `int`、`long` 和 `long long`,只需在后加 `l` 或 `ll` 后缀(如 `__builtin_popcountll`)。

这些内建函数通常能够利用底层硬件指令进行优化。现代处理器一般有专门的指令支持二进制位操作,例如:

  • **`__builtin_popcount`** 可以使用处理器的 **POPCNT** 指令。

  • **`__builtin_clz`** 和 **`__builtin_ctz`** 可使用 **LZCNT** 和 **TZCNT** 指令。

这些指令直接由硬件执行,比手动循环计算快得多,特别是在处理大量数据或频繁位运算时能够显著提升性能。

相关推荐
艾莉丝努力练剑22 分钟前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
CoovallyAIHub37 分钟前
ICLR 2026 惊现 SAM 3,匿名提交,实现“概念分割”,CV领域再迎颠覆性突破?
深度学习·算法·计算机视觉
IT古董1 小时前
【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(2)BiseNet系列算法详解
算法·计算机视觉·制造
电鱼智能的电小鱼1 小时前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 预测性维护方案
网络·人工智能·嵌入式硬件·算法·制造
yan8626592461 小时前
于 C++ 的虚函数多态 和 模板方法模式 的结合
java·开发语言·算法
小此方1 小时前
C语言自定义变量类型结构体理论:从初见到精通(下)
c语言·数据结构·算法
_poplar_2 小时前
15 【C++11 新特性】统一的列表初始化和变量类型推导
开发语言·数据结构·c++·git·算法
CoovallyAIHub2 小时前
YOLO Vision 2025 还没结束!亚洲首场登陆深圳,YOLO26有望亮相
深度学习·算法·计算机视觉
寂静山林2 小时前
UVa 10447 Sum-up the Primes (II)
算法
zy_destiny3 小时前
【工业场景】用YOLOv8实现行人识别
人工智能·深度学习·opencv·算法·yolo·机器学习