2025.02.20 2945 每日一题 奇偶位数
https://leetcode.cn/problems/number-of-even-and-odd-bits
题解
public int[] evenOddBit(int n) {
int even = 0, odd = 0;
int index = 0;
// 直接从右往左遍历二进制各位,index 从 0 开始正好表示位下标
while (n > 0) {
// 如果当前位为 1,就根据下标奇偶更新对应计数
if (n % 2 == 1) {
if (index % 2 == 0) {
even++;
} else {
odd++;
}
}
n = n / 2;
index++;
}
return new int[]{even, odd};
}
主要知识
Java中将整数转二进制(从低位到高位)
我的评价是
int n = 13; // 示例整数
String binaryStr = Integer.toBinaryString(n); // "1101"
做你妈呢废物
在Java中,将整数转换为二进制位的常用方法主要有以下几种,每种方法都有其使用场景和细节注意点:
1. 使用内置API方法
- Integer.toBinaryString(n)
- 直接返回一个字符串,该字符串由'0'和'1'组成,表示整数n的二进制形式。
- 优点:简单、直观,适用于需要显示或简单转换成字符串的场景。
- 缺点:如果需要对每个位进行进一步操作(如统计特定位出现的次数),可能需要先将字符串转换为字符数组或对字符串逐字符遍历。
示例代码int n = 13; // 示例整数
String binaryStr = Integer.toBinaryString(n); // "1101":
2. 手动取余与除法法
- 思想:不断取当前整数与2的余数,余数即为最低位的二进制数,然后除以2,将数缩小,直至数为0。
- 细节注意:
- 由于采用取余操作,每次得到的二进制位顺序是从低位到高位(即下标0代表最右边的位)。
- 如果需要从高位到低位,可以在存储后对结果进行反转,或直接调整遍历逻辑。
- 示例步骤:
1. 初始化一个列表或数组以保存二进制位。
2. 使用`while(n > 0)`循环,依次执行:
- 获取最低位:`int bit = n % 2;` 或者使用位运算 int bit = n & 1;
- 存储该位
- 更新 n:`n = n / 2;` 或 n >>= 1;
3. 最终根据需要将结果转换成合适的格式(比如数组或字符串)。
示例代码:
int n = 13; // 示例整数
List<Integer> bits = new ArrayList<>();
while (n > 0) {
int bit = n % 2; // 或 int bit = n & 1;
bits.add(bit);
n = n / 2; // 或者 n >>= 1;
}
// bits中存储的顺序为从最低位到最高位
3. 使用位操作法
- 思想:通过右移操作直接检查每一位,使用按位与运算符提取指定位。
- 细节注意:
- 对于32位整数,可以从0到31遍历每一位:
- 计算公式:`int bit = (n >> i) & 1;`
- 这种方法可以让你根据位的下标进行自定义处理,比如统计某些特定位的值或做其他位运算。
示例代码:
int n = 13; // 示例整数
for (int i = 0; i < 32; i++) {
int bit = (n >> i) & 1;
// 根据需要对bit进行处理,例如统计每位上1的出现次数等
}
总结
- 内置API适用于简单转换为二进制字符串,但后续位操作需要转换。
- 手动取余/除法方法直观、易于理解,特别适合统计过程中直接处理每一位,注意下标顺序问题(低位开始)。
- 位操作方法高效、用于精准提取指定位,适用于需要对整数每一位做精细控制的场景。
掌握这些方法后,可以根据具体问题选择最合适的手段来处理整数与二进制之间的转换与操作。
#算法题(1)文章作者:Administrator
文章链接:http://localhost:8090/archives/2025.02.20-2945-mei-ri-yi-ti-qi-ou-wei-shu
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!
评论