C - 将所有偶数位设置为 1 的方法

C - Method for setting all even-numbered bits to 1

我负责编写一个方法,"returns the word with all even-numbered bits set to 1." 对 C 来说是全新的,这看起来确实令人困惑和不清楚。我不明白如何用 C 更改数字的位。这似乎是一个非常低级的指令,我什至不知道如何用 Java(我的母语)来做到这一点!有人可以帮帮我吗!这是方法签名。

int evenBits(void){
    return 0;
}

任何有关如何执行此操作的说明,甚至有关如何开始执行此操作的指导,将不胜感激。非常感谢!

把它分解成两个问题。

(1) 给定一个变量,如何设置特定位?

提示:使用按位运算符。

(2) 如何找到 "all even-numbered bits" 的表示形式以便我可以使用按位运算符来设置它们?

提示:使用数学。 ;-) 您可以制作一个 table(或找到一个),例如:

Decimal | Binary
--------+-------
      0 | 0
      1 | 1
      2 | 10
      3 | 11
    ... | ...

一旦您知道使用什么操作来设置特定位,并且知道在 C 中使用它的十进制(或十六进制)整数文字,您就解决了问题。

您必须给出所有偶数位的精确定义。在不同的体系结构上,位以不同的方式编号。硬件人员喜欢从 132 从最低有效位到最高有效位,或者有时相反,从最高有效位到最低有效位……而软件人员喜欢从 0 开始按递增顺序对位进行编号,因为位 0 表示数字 20,即:1.

使用后一种编号系统,位模式将是 0101...0101,因此是十六进制值 0x555...555。如果您从 1 开始为最低有效位编号,则模式将为 1010...1010,十六进制 0xAAA...AAA。但这种表示实际上在当前架构上编码了一个负值。

对于这个答案的其余部分,我假设偶数位是表示 2 的偶数次方的位:1 (20), 4 (22), 16 (24)...

这个问题的简短答案是:

int evenBits(void) {
    return 0x55555555;
}

但是如果 int 有 64 位呢?

int evenBits(void) {
    return 0x5555555555555555;
}

将处理 64 位 int,但会在 int 较小的系统上具有实现定义的行为。

使用 <limits.h> 中的宏,您可以屏蔽掉额外的位来处理 16、32 和 64 位整数:

#include <limits.h>

int evenBits(void) { 
    return 0x5555555555555555 & INT_MAX;
}

但是这段代码还是做了一些假设:

  • int 最多 64 位。
  • int 的位数为偶数。
  • INT_MAX 是 2 减 1 的幂。

这些假设对大多数当前系统都有效,但 C 标准允许在一个或多个无效的情况下实现。

所以基本上每隔一位都必须设置为 1?这就是我们在 C 中进行按位运算的原因。想象一下常规位数组。你想要的是最右边的偶数位并将其设置为 1(这是数字 2)。然后我们只需使用 OR 运算符 (|) 来修改我们现有的数字。这样做之后。我们将数字向左移动 2 位 (<< 2),与之前的 0010 相比,这会将位数组修改为 1000。然后我们再次执行相同操作并使用 or 运算符。下面的代码描述得更好。

#include <stdio.h>

unsigned char SetAllEvenBitsToOne(unsigned char x);
int IsAllEvenBitsOne(unsigned char x);

int main()
{
    unsigned char x = 0; //char is one byte data type ie. 8 bits.

    x = SetAllEvenBitsToOne(x);
    int check = IsAllEvenBitsOne(x);
    if(check==1)
    {
        printf("shit works");
    }

    return 0;
}

unsigned char SetAllEvenBitsToOne(unsigned char x)
{
    int i=0;
    unsigned char y = 2;
    for(i=0; i < sizeof(char)*8/2; i++)
    {
        x = x | y;
        y = y << 2;
    }
    return x;
}

int IsAllEvenBitsOne(unsigned char x)
{
    unsigned char y;
    for(int i=0; i<(sizeof(char)*8/2); i++)
        {

            y = x >> 7;
            if(y > 0)
            {
                printf("x before: %d\t", x);
                x = x << 2;
                printf("x after: %d\n", x);
                continue;
            }
            else
            {
                printf("Not all even bits are 1\n");
                return 0;
            }
        }
        printf("All even bits are 1\n");
        return 1;
}

这里是link到Bitwise Operations in C