2026-01-22-牛客每日一题-二进制不同位数


title: 2026-01-22-牛客每日一题-二进制不同位数

date: 2026-01-22

tags:

  • 算法学习
  • 牛客
  • 位运算

题目信息

  • 平台:牛客
  • 题目:二进制不同位数
  • 难度:简单
  • 题目链接

题目描述

给定两个整数 m、n,计算它们二进制表示中不同位的数量。


初步思路

  1. 不同位的数量等价于 m 与 n 的异或结果中 1 的个数。
  2. x = m ^ n 得到所有不同位。
  3. 通过 x &= x - 1 每次消去最低位的 1,并计数。
md 复制代码
示例
x     = 1100111 | 1100100
x-1   = 1100110 | 1100011
x&x-1 = 1100110 | 1100000

最低位的1消去了

算法分析

  • 核心:异或 + 统计二进制 1 的个数
  • 技巧:Brian Kernighan 位计数法
  • 时间复杂度:O(k),k 为不同位数量(x 中 1 的个数)
  • 空间复杂度:O(1)

代码实现(C++)

cpp 复制代码
/*
 * @Author: tkzzzzzz6
 * @Date: 2026-01-22 22:21:35
 * @LastEditors: tkzzzzzz6
 * @LastEditTime: 2026-01-22 22:21:39
 */

#include <iostream>
using namespace std;

int main() {
    int m,n;
    cin >> m >> n;
    int x = m^n;
    int ans =0;
    while(x !=0){
        x &=x-1;
        ++ans;
    }
    cout << ans;
    return 0;
}

总结与反思

  1. 用异或能直接锁定不同位。
  2. 位计数法比逐位扫描更简洁高效。
相关推荐
折哥的程序人生 · 物流技术专研3 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
想吃火锅10054 小时前
【leetcode】14.最长公共前缀js
算法·leetcode·职场和发展
云絮.5 小时前
数据库操作
数据库·mysql·算法·oracle
小林ixn5 小时前
LeetCode 206. 反转链表(迭代 + 递归详解)
算法·leetcode·链表
凡人叶枫6 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
菜鸟‍7 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展
退休倒计时8 小时前
【每日一题】LeetCode 142. 环形链表 II TypeScript
算法·leetcode·链表·typescript
popcorn_min9 小时前
Digits 手写数字识别:随机森林多分类 + 像素级特征热力图
算法·随机森林·分类
liulilittle9 小时前
拥塞控制:排水终止的两种决策:OR 与 AND
网络·tcp/ip·计算机网络·算法·信息与通信·tcp·通信
weixin_3077791310 小时前
从脚本执行到智能体协作:AI辅助测试能力的范式重构
运维·开发语言·人工智能·算法·测试用例