给定一个数字 n 和两个整数 p1,p2 确定位置 p1 和 p2 中的位是否相同.位置 p1、p2 和 1 为基础
Given a number n and two integers p1,p2 determine if the bits in position p1 and p2 are the same or not. Positions p1,p2 and 1 based
我一直在做一些小的代码测验,只是为了在毕业后赶上我的编码,但这个让我的树桩。问题来了:
给定一个数字 n 和两个整数 p1,p2 确定位置 p1 和 p2 中的位是否相同。 基于 p1、p2 和 1 的位置。
例
22,3,2 是正确的,因为它是 0001 0110,因为 2 和 3 位置相同。
我解决了一种方法,即将十进制转换为二进制,然后转换为字符串并检查位置中的位是否相同,但我觉得有一种更简单的方法可以进行位操作,但我不太擅长它。我在想,如果我能把位移到第一个位置并比较它们,我就可以得到答案,但是当我将它们移到左移位时,我遇到了问题,因为它们只是溢出。
您可以将
感兴趣的位移动到最不重要的位置,然后用&
屏蔽所有其他位。
假设 p1
和 p2
是从零开始的索引,从最低有效位开始计数:
bool same_bits = (((n >> p1) & 1) == ((n >> p2) & 1))
int bitPositionsSame(uint32_t n, uint32_t p1, uint32_t p2) {
uint32_t i1 = (n & (1 << p1)) >> p1;
uint32_t i2 = (n & (1 << p2)) >> p2;
return (i1 == i2);
}
我认为你可以做到
(((0x1 <<p1) & n) == 0) == ((0x1 <<p2) & n) == 0)
这将创建一个 1 的位掩码作为 p1/p2 位,然后将其应用于数字。然后,我们检查两者是否为零,并比较结果。
无法检查,因为我现在不在电脑前,但我认为它应该可以:)
编辑:当我输入答案时,其他一些人打字更快......
在 C 中:
#define SAMEBIT(n, p1, p2)
((n >> (p1-1)) & (n >> (p2-1)) & 1)
在Smalltalk中:
(n bitAt:p1) = (n bitAt:p2)
在爪哇中:
like C
您可以使用位掩码和&
(按位和)运算符执行此操作。通过使用<<
(左移)将1
位移动到正确的位置,可以创建两个位掩码(一个用于p1
,另一个用于p2
)。用每个位掩码n
并比较结果。
假设 0 基于最高有效位(即符号位为 0)
boolean bitPositionsSame(int n, int p1, int p2) {
return (n & 0x80000000>>>p1)==(n & 0x80000000>>>p2);
}
获取p1
位n
:
(n >> (p1-1)) & 1
获取p2
n
:
(n >> (p2-1)) & 1
比较它们的相等性:
bool result = ((n >> (p1-1))&1) == ((n >> (p2-1))&1)
这是另一种变体:
bool same_bits = !(n & p1 - 1) == !(n & p2 - 1);
强制按位 AND 的结果类型与!
bool
会将可能的值限制为仅 0
或 1
。
相关文章:
- 请解释"函数1(p1,p2,p3);"的输出
- 检查值是否在集合p1和p2中,但不在p3中
- 使用 2x1 图块平铺 2xM 数组以最大化差异 - INOI 2008,P2
- 致命错误 C1001:编译器中发生内部错误。'f:\dd\VCtools\Compiler\cxFE\SL\P1\C\P0io.c'
- 无法使用 *p1 / *p2,因为它正在考虑将 /* 作为评论部分的开头
- C 将二进制(P5)图像转换为ASCII(P2)图像(.pgm)
- 给定 int **p1 和 const int**p2 是 p1 == p2 格式良好
- 当处理指针时,控制台中为*p1和p显示的不同值的含义
- 为什么 p2 不是声明 int* p1, p2; 中的指针类型
- 如何修复此编译错误:(编译器文件'F:\DD\VCtools\编译器\CXXFE\SL\P1\C\Template.cpp',第 22679 行)?
- 对[基本范围]的解释当非限定名称查找涉及到使用-指令时,隐藏]p2
- 如何解释规则[命名空间].c++标准中的Udir]p2
- R(C::*)(P1,P2)是什么意思
- 给定一个数字 n 和两个整数 p1,p2 确定位置 p1 和 p2 中的位是否相同.位置 p1、p2 和 1 为基础
- 代码生成失败:'p2'中'-FitObjData'无法识别的标志