tech-interview-handbook 二进制与位运算学习指南:从进制转换到位操技巧的面试实战 tech-interview-handbook 二进制与位运算学习指南从进制转换到位操技巧的面试实战【免费下载链接】tech-interview-handbookCurated coding interview preparation materials for busy software engineers项目地址: https://gitcode.com/GitHub_Trending/te/tech-interview-handbook本篇基于 tech-interview-handbook 仓库中的二进制算法学习指南binary.md系统讲解编码面试中二进制数制与位运算的核心知识如何在所选编程语言中完成十进制与二进制的互转、八条必须烂熟于心的位操作技巧、需要重点防范的边界情况以及配套的精选题目与学习资源。读完本文你将能够独立写出进制转换逻辑、运用位运算技巧解决面试中的常见位操作题并清楚该主题在整体面试复习计划中的优先级定位。二进制主题在面试复习中的定位在动手深入细节之前先明确这个话题的分量。二进制学习指南在 学习指南总览 的主题优先级表中被标注为Low低优先级主题优先级BinaryLow指南原文给出的判断依据是对大多数软件工程师而言日常工作中很少直接处理位bit位运算更多出现在底层系统和底层编程语言场景中。因此它对大多数工程师的编码面试来说重要性相对较低——但它仍会被偶尔问到所以底线要求是你必须熟练掌握**在你所选编程语言中把十进制数转成二进制形式以及反向转换**的方法。从站点结构看该指南通过 sidebars.js 中注册的algorithms/binary条目挂载到算法栏目下与 array、string、hash-table 等 19 个主题的 cheatsheet 并列各指南的结构规范可参考仓库中的template.md。此外仓库的题库分组数据 QuestionGroups.json 中Add Binary一题也被归类在binary主题下可见二进制在题库体系中确有独立归类。实用结论如果你时间紧张把 array、string、sorting/searching、tree、graph 等高优先级主题吃透后再回头补二进制但无论如何进制转换 位运算技巧表这两块是最小必修项。核心基本功十进制与二进制的互转指南反复强调这一点涉及二进制表示和位运算的题目偶尔会被问到你必须绝对熟悉如何在你选择的编程语言中把数字从十进制形式转成二进制形式以及反过来。仓库中的参考实现仓库在apps/website/experimental/utilities/javascript/目录下提供了两个带自测用例的 JavaScript 参考实现正好覆盖两个方向二进制字符串 → 整数Hacker 算法见 binToInt.js// Does not handle negative binary numbers. function binToInt(binary) { let res 0; for (let i 0; i binary.length; i) { res res * 2 binary[i]; } return res; }核心是res res * 2 binary[i]这一行从左到右逐位扫描每一步把已累积的结果左移一位乘 2再加上当前位的值。以1100011为例累积过程为1 → 3 → 6 → 12 → 24 → 49 → 99与内置解析结果一致。文件末尾用一系列console.log断言把每个用例与parseInt(binary, 2)对拍验证包括1100011 99这种较长用例。注意源码注释明确说明不处理负的二进制数——这正是下文 Corner cases 中负数要点的实际体现。整数 → 二进制字符串短除 2 法见 intToBin.js// Does not handle negative numbers. function intToBin(number) { if (number 0) { return 0; } let res ; while (number 0) { res String(number % 2) res; number parseInt(number / 2, 10); } return res; }思路是反复对 2 取余得到最低位、再整除 2把余数倒序拼回所以每轮用String(number % 2) res前插。0需要单独处理——这也是仓库实现对指南中负数/边界要点的回应源码注释写明Does not handle negative numbers。测试用例覆盖0、1、2、3、5、99全部与(number).toString(2)对拍一致。这两个实现值得在面试前手推一遍如果面试官追问你内置函数是怎么算的你能直接口述出算法本体而不是只会调 API。各语言内置转换速查按template.md 中Implementations一节的组织方式二进制指南实际面试中最常用的是语言内置 API以下是常用语言的通用写法面试前先在你的主力语言中验证一遍输出格式语言十进制 → 二进制二进制 → 十进制JavaScript(num).toString(2)parseInt(str, 2)Pythonbin(num)带0b前缀/format(num, b)int(str, 2)JavaInteger.toBinaryString(num)Integer.parseInt(str, 2)Cstd::bitset32(num).to_string()std::stoul(str, nullptr, 2)Gostrconv.FormatInt(num, 2)strconv.ParseInt(str, 0, 64)注意各语言对负数的行为差异如 JavaScript 的toString(2)会返回补码表示的长字符串Python 的bin(-5)得到-0b101这直接关联下一条边界情况。位运算技巧速查表指南给出的Some helpful utility snippets共 8 条完整继承如下表技巧代码测试第 k 位是否为 1num (1 k) ! 0置 1 第 k 位num \| (1 k)清零第 k 位num ~(1 k)翻转第 k 位num ^ (1 k)乘以 2 的 k 次方num k除以 2 的 k 次方num k判断是否为 2 的幂(num (num - 1)) 0或(num (-num)) num交换两个变量num1 ^ num2; num2 ^ num1; num1 ^ num2下面逐条展开原理帮助理解为什么这样做对而不是机械背诵。构造掩码1 k。所有单比特操作的第一块积木。1 k得到一个只有第 k 位为 1、其余全 0 的数bit 编号从 0 开始即最低位为第 0 位。后续操作都是拿它与原数做按位组合。测试第 k 位AND 测试。num (1 k) ! 0AND 的性质是两位都为 1 结果才为 1掩码其余位全是 0所以结果要么为 0、要么恰好等于1 k。这是数有多少个 1Number of 1 Bits 题的标准逐位扫描法function countOneBits(num) { let count 0; while (num 0) { count num 1; // 只看最低位 num 1; // 右移一位 } return count; }置 1 位OR与清零位AND NOT。OR 的性质是任一为 1 即为 1所以num | (1 k)只会把第 k 位写成 1不动其他位清零则相反用~(1 k)构造一个只有第 k 位是 0、其余全是 1的掩码再做 AND只有第 k 位被强制清 0。翻转位XOR。XOR 是不同为 1掩码第 k 位是 1所以原位是 0 变 1、是 1 变 0其余位与 0 异或保持不变。这一性质还支撑了两条交换两变量的技巧a^b; b^a; a^b;利用x^x0与x^0x完成无临时变量交换。移位 乘除 2 的幂。num k等价于乘 2 的 k 次方num k等价于整除向下取整这也是除以 2 的 k 次方条目的来源。面试中凡是看到×8/÷4这类操作应条件反射地想到用移位替代以提升效率——但要记住移位只对整数成立且对负数的右移在不同语言中语义不同见下文。判断 2 的幂两条等价的技巧。(num (num - 1)) 02 的幂的二进制形如1000...0减 1 后变成0111...1两者 AND 必为 0非 2 的幂则至少两位为 1减 1 后不会全被抵消。必须额外要求num 0否则0 (0 - 1) 0也会误判通过——这是该技巧最容易踩的坑。(num (-num)) num利用负数取反的补码性质-num会截取出num最低位的 1即最低置位位若这个值等于num本身说明num只有一个位为 1即 2 的幂。同样需要num 0。这两条也是Counting Bits、Single Number等题目的底层工具建议配合下文题目一起练。Corner cases边界情况与常见陷阱指南列出的边界清单只有一句话但每一条都对应真实会翻车的写法警惕并检查溢出/下溢overflow/underflow移位操作尤其危险。1 k在 k 较大时会超出语言整数/浮点表示范围如 JavaScript 按位运算符只处理 32 位整数1 32的结果与1 0相同累乘、累加类位运算如计数、区间求和也要确认中间值不越界。负数Negative numbers位运算对负数走补码表示逻辑右移与算术右移结果不同仓库的 intToBin.js 与 binToInt.js 均在注释中声明不处理负数说明负数处理需要单独设计如符号位 绝对值或直接依赖语言补码语义判断 2 的幂技巧需排除num 0进制转换内置 API 对负数的输出格式因语言而异前缀0b、负号位置等面试中先与面试官确认输入范围。此外通用面试提示可参考 学习指南总览 General interview tips 一节同样适用于位运算题先验证输入、检查 off-by-one、写完代码后用若干样例如 0、1、2 的幂、负数自测。Essential questions必练题指南给出的 Essential questions如果只练两题就练这两题级别Sum of Two Integers两整数之和—— 用被禁止后用、^模拟加法carry a bsum a ^ b循环把进位左移后相加直到进位为 0。这道题强制你理解补码加法在位层面的真实过程是位运算的压舱石题。Number of 1 Bits统计置位比特数—— 输入一个 32 位无符号整数统计其二进制中 1 的个数。标准做法即上文测试第 k 位的逐位扫描进阶可学 Brian Kernighan 法num (num - 1)逐次消去最低位 1循环次数恰好等于 1 的个数。Recommended practice questions进阶练习题在吃透上述两题后指南推荐继续练习Counting Bits比特位计数—— 对0..n逐个统计 1 的个数考察从f(i)推导f(i)的动态规划式优化如count[i] count[i 1] (i 1)位运算与 DP 思想的结合点。Missing Number缺失数字—— 经典的异或求法把0..n全部异或再异或一遍数组成对出现的数被x^x0抵消剩下即为缺失值也考察不用额外空间这一约束下的位运算直觉。Reverse Bits反转比特—— 直接对 32 位整数逐位右移、把最低位累积到结果的高位result (result 1) | (num 1); num 1是测试最低位 移位累积组合拳的标准模板也是仓库中 Add Binary 归类 之下 binary 主题的典型题型。Single Number只出现一次的数字—— 全数组异或出现两次的数互相抵消留下的即答案。它是 XOR 交换性质a^a0、a^0a的直接应用务必做到不看题解独立写出。学习资源与推荐课程指南为每个主题配三档学习资源二进制指南binary.md的清单为阅读basecs 的《Bits, Bytes, Building With Binary》建立对二进制数制的直观认识Wikipedia 的 Bitwise operation 词条系统参考按位操作全集。视频HackerRank 的《Algorithms: Bit Manipulation》配合题目讲解位操作技巧。练习在线交互式位运算练习场Bit operations 练习页适合在写代码前热身手感。指南末尾统一挂载 AlgorithmCourses.md 中的推荐课程所有算法 cheatsheet 共用同一套课程推荐课程特点AlgoMonster由 Google 工程师打造数据驱动地教授最高频的题解模式一次性买断、终身访问Grokking the Coding Interview: Patterns for Coding QuestionsDesign Gurus 出品从题目模式视角组织练习支持 Java/Python/C/JavaScript 多语言解答与分步可视化演示Master the Coding Interview: Data Structures AlgorithmsUdemy 高评分课程约 19 小时内容除编码面试外还覆盖简历、非技术面试与薪资谈判在仓库中的延伸阅读路径本指南原文apps/website/contents/algorithms/binary.md算法指南总览与优先级表apps/website/contents/algorithms/study-cheatsheet.md进制转换参考实现含自测断言binToInt.js、intToBin.js指南结构模板各 cheatsheet 统一遵循的章节骨架template.md题库主题分组数据binary 主题归类QuestionGroups.json小结二进制是编码面试中低概率但可完全准备的主题。最小知识集 熟练的进制互转内置 API 手写算法 八条位操作技巧重点理解1 k掩码、2 的幂判定、XOR 抵消 负数与溢出两条边界检查练习顺序 Sum of Two Integers、Number of 1 Bits 两题打底再推进 Counting Bits、Missing Number、Reverse Bits、Single Number 四题巩固。【免费下载链接】tech-interview-handbookCurated coding interview preparation materials for busy software engineers项目地址: https://gitcode.com/GitHub_Trending/te/tech-interview-handbook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考