二进制位1计数技巧与整数表示优化

需积分: 0 1 下载量 25 浏览量 更新于2024-06-30 收藏 1.1MB PDF 举报
本篇文章主要讨论了两个与编程相关的算法问题,一个是LeetCode中的第191题——“位1的个数”(汉明重量),另一个是“颜色分类”问题。 1. **位1的个数题目(汉明重量)** - 题目要求编写一个函数`hammingWeight`,接收一个无符号整数作为输入,该函数的目的是计算其二进制表示中1的个数。这可以使用位运算来解决,具体来说是通过`lowbit(x)`函数找到第一个1的位置。`lowbit(x)`函数的实现利用了按位与操作`&`和负数取反`-x`的特性,当`x`除以它的最低位1后,结果会自动去掉最低位的1,然后再次与-1按位与,此时最低位1会变成最高位1,而其他位都变为0,所以最后的结果就是-1,即为最低位1的相反数,即低一位的值。例如,`lowbit(10)`的结果是2,因为10的二进制表示中最低位1是第2位。 2. **整数n的二进制表示中第k位获取** - 提供了一个技巧来找出整数n的二进制表示中第k位的值。首先,通过右移操作`n>>k`将第k位移动到最低位,然后通过与1(`n&1`)操作判断个位上的值,如果是1,则该位为1,否则为0。这种方法利用了位运算的特性,右移操作会丢弃低位,而与1则用来检查最后一位。 3. **颜色分类题目** - 这个问题是关于数组元素的排序,要求相同颜色的元素相邻,且遵循红、白、蓝的顺序。这是一个典型的三路排序问题,可以使用计数排序或者类似的方法,先统计每个颜色的数量,然后依次填充到排序后的数组中,注意保持颜色的顺序。 这两个算法都涉及到了基础的位运算和数据结构的巧妙应用,理解并掌握这些技巧对于提高编程能力,特别是解决LeetCode这类编程面试题非常关键。在实际的编程过程中,通过优化算法,比如使用位运算替代循环来减少计算复杂度,能够有效提升代码效率。同时,这种题目锻炼了程序员对数据的理解和处理能力,是提升编程技能的重要途径。