给定一个数字 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

本文关键字:p2 p1 位置 是否 定位 为基础 数字 一个 两个 整数      更新时间:2023-10-16

我一直在做一些小的代码测验,只是为了在毕业后赶上我的编码,但这个让我的树桩。问题来了:

给定一个数字 n 和两个整数 p1,p2 确定位置 p1 和 p2 中的位是否相同。 基于 p1、p2 和 1 的位置。

22,3,2 是正确的,因为它是 0001 0110,因为 2 和 3 位置相同。

我解决了一种方法,即将十进制转换为二进制,然后转换为字符串并检查位置中的位是否相同,但我觉得有一种更简单的方法可以进行位操作,但我不太擅长它。我在想,如果我能把位移到第一个位置并比较它们,我就可以得到答案,但是当我将它们移到左移位时,我遇到了问题,因为它们只是溢出。

您可以将

感兴趣的位移动到最不重要的位置,然后用&屏蔽所有其他位。

假设 p1p2 是从零开始的索引,从最低有效位开始计数:

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);
}

获取p1n

(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会将可能的值限制为仅 01