牛客网 二进制中1的个数

题目描述:

输入一个整数,输出 该数二进制表示中1的个数。其中负数用补码表示。

时间限制:1秒  空间限制:32768K


将1左移,依次进行与运算,判断是不是1,是1,则count++。

public int Solution1(int n) {
		int count = 0;
		int flag = 1;
		while (flag != 0) {
			if ((flag & n) != 0) {
				count++;
			}
			flag = flag << 1; // 左移一位,和n想与进行判断是不是为1
		}
		return count;

	}

大神的最优解(看不太懂...)

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while (n != 0) {
            count++;
            n = (n - 1) & n;
        }
        return count;
    }
}
<think>首先,用户的问题是:“请问二进制练习题 计算机基础 习题集”,意思是“请问二进制练习题 计算机基础 习题集”。用户意图是寻找与二进制相关的练习题或学习资源,特别是针对计算机基础的习题集。 从系统级指令中,我需要遵循: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:引用[1]是关于C语言二进制题目的总结,包括各种问题如计算二进制1个数、判断2的次方数等。引用[2]是关于进制转换的答案和解析,强调二进制和十六进制范围相同。 用户上一次的问题和我的回答:用户的问题是新的,没有指定历史对话,所以我应该基于当前问题回答。 我的回答结构: 1. **引言**:确认用户需求,并简要介绍二进制在计算机基础中的重要性。 2. **提供练习题**:基于引用[1],列出一些二进制练习题,包括计算二进制1个数、判断2的次方数、位置操作等。每个问题给出示例或描述。 3. **解答或提示**:为每个问题提供简要解答或方法,使用数学表达式格式。 4. **生成相关问题**:在末尾添加相关问题部分,如§§相关问题§§。 5. **引用**:自然地添加引用标识。 练习题列表(从引用[1]): 1. 编写代码实现:求一个整数存储在内存中的二进制1个数。 - 方法一:使用位操作。 - 方法二:使用模运算。 - 方法三:使用Brian Kernighan算法。 - 方法四:使用查表。 2. 判断一个数n是否是2的次方数。 3. 二进制位置0或者置1。 4. 编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? - 方法一:异或后统计1个数。 - 方法二:使用位操作。 5. 打印整数二进制的奇数位和偶数位。 6. 找单身狗问题:数组中只有一个数出现一次,其他出现两次。 - 暴力求解。 - 用异或操作符求解。 7. 消失的数字:数组中数字从0到n缺失一个。 引用[2]提到进制转换,我可以添加一些进制转换的练习题。 回答结构: - 开头:介绍二进制练习题的重要性。 - 列出练习题:每个问题编号,简要描述。 - 对每个问题提供解答或代码示例(使用代码块)。 - 结束时添加相关问题。 - 添加引用标识。 使用LaTeX: - 行内数学表达式:如$n$,$2^k$。 - 独立公式:如二进制表示。 生成相关问题: - 如:1. 如何优化二进制1的计数算法? - 2. 二进制在计算机中如何表示负数? - 3. 进制转换的常见方法有哪些? 最终回答: - 用中文。 - 结构清晰。</think>### 二进制练习题集(计算机基础) 在计算机基础中,二进制是信息表示的核心,涉及位操作、进制转换等关键概念。以下习题集基于经典问题整理,涵盖二进制运算、位操作、算法实现等,适合初学者巩固知识。每个问题都附有简要解答或代码示例(使用Python或伪代码),帮助您逐步理解。数学表达式遵循规范:行内公式如$n$,独立公式单独成段如二进制转换。 #### 1. 求整数二进制1个数 编写代码实现:输入一个整数,输出其在内存中二进制表示时1的位数。 - **方法一(位操作)**:使用循环右移和按位与操作。 ```python def count_ones(n): count = 0 while n: count += n & 1 # 检查最低位是否为1 n >>= 1 # 右移一位 return count ``` - **方法二(Brian Kernighan算法)**:优化版本,时间复杂度$O(k)$(k为1个数)。 ```python def count_ones(n): count = 0 while n: n &= n - 1 # 清除最低位的1 count += 1 return count ``` **解答提示**:设整数为$n$,二进制1个数等于$n \mod 2$的累计和。方法二更高效,适用于大整数[^1]。 #### 2. 判断一个数是否是2的次方数 输入整数$n$,判断其是否满足$n = 2^k$(k为整数)。 - **代码实现**: ```python def is_power_of_two(n): return n > 0 and (n & (n - 1)) == 0 # 利用二进制特性:2^k的二进制只有一位为1 ``` **解答提示**:2的次方数在二进制中仅有一个1,如$8 = 1000_2$。使用位操作$n \& (n-1)$可快速检测[^1]。 #### 3. 二进制位置0或置1 编程实现:给定整数$n$和位置$i$(从0开始),将二进制第$i$位置0或置1。 - **置0操作**: ```python def set_bit_zero(n, i): mask = ~(1 << i) # 创建掩码,第i位为0,其余为1 return n & mask ``` - **置1操作**: ```python def set_bit_one(n, i): return n | (1 << i) # 使用或操作设置第i位 ``` **解答提示**:设位置$i$,置0使用掩码$ \text{mask} = \neg(1 \ll i) $,置1使用$ n \mid (1 \ll i) $[^1]。 #### 4. 计算两个整数二进制位不同的数量 输入两个32位整数$m$和$n$,输出它们二进制表达中不同位的个数。 - **方法一(异或后统计1个数)**: ```python def hamming_distance(m, n): xor = m ^ n # 异或操作,不同位为1 return count_ones(xor) # 复用问题1的count_ones函数 ``` - **方法二(直接位比较)**: ```python def hamming_distance(m, n): count = 0 for i in range(32): # 32位整数 bit_m = (m >> i) & 1 bit_n = (n >> i) & 1 count += 1 if bit_m != bit_n else 0 return count ``` **解答提示**:汉明距离通过$m \oplus n$计算,不同位数为异或结果中1个数[^1]。 #### 5. 打印整数的二进制奇数位和偶数位 输入整数$n$,打印其二进制表示的奇数位(从右向左,索引从0开始)和偶数位。 - **代码实现**: ```python def print_bits(n): print("奇数位(索引1,3,5,...):", end=" ") for i in range(1, 32, 2): # 步长为2,取奇数索引位 bit = (n >> i) & 1 print(bit, end=" ") print("\n偶数位(索引0,2,4,...):", end=" ") for i in range(0, 32, 2): # 步长为2,取偶数索引位 bit = (n >> i) & 1 print(bit, end=" ") ``` **解答提示**:二进制位从右向左索引(LSB为0),奇数位对应索引1,3,5,...,偶数位对应0,2,4,...[^1]。 #### 6. 找“单身狗”问题(数组中唯一出现一次的数字) 给定数组,除一个元素出现一次外,其余均出现两次。找到该元素。 - **暴力求解**:遍历统计频率。 ```python def find_single(arr): from collections import Counter count = Counter(arr) for num, freq in count.items(): if freq == 1: return num ``` - **优化方法(异或操作)**: ```python def find_single(arr): result = 0 for num in arr: result ^= num # 异或操作:a XOR a = 0, a XOR 0 = a return result ``` **解答提示**:利用异或性质$ a \oplus a = 0 $和$ a \oplus 0 = a $,时间复杂度$O(n)$,空间$O(1)$[^1]。 #### 7. 消失的数字 数组包含$[0, n]$中的$n$个整数,缺失一个数字。找出缺失值。 - **代码实现**: ```python def missing_number(nums): n = len(nums) total_sum = n * (n + 1) // 2 # 0到n的和公式 actual_sum = sum(nums) return total_sum - actual_sum ``` **解答提示**:设数组长度为$n$,缺失数字为$ \text{total\_sum} - \text{actual\_sum} $,其中$\text{total\_sum} = \frac{n(n+1)}{2}$[^1]。 #### 8. 进制转换练习题(基于引用[2]) - **问题**:将十进制数$15$转换为二进制和十六进制。 **解答**: $$ 15_{10} = 1111_2 = \text{F}_{16} $$ 二进制转换:连续除以2取余;十六进制:二进制每4位分组(1111对应F)[^2]。 - **问题**:证明相同位数的二进制和十六进制能表示的范围相同。 **解答**:设位数为$k$,二进制范围$[0, 2^k - 1]$,十六进制范围$[0, 16^k - 1]$,但$16^k = (2^4)^k = 2^{4k}$,因此对于相同$k$位,范围相同(如8位二进制和2位十六进制都表示$[0, 255]$)[^2]。 ### 学习资源建议 - **推荐习题集**:C语言二进制问题大合集(引用[1])覆盖了上述所有问题,适合编程实践。 - **进制转换解析**:计算机基础 - 进制转换(引用[2])提供详细答案和概念解释。 - **练习平台**:尝试在线平台如LeetCode或牛客网,搜索“二进制”、“位操作”标签题目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值