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

时间:2016-03-14 20:26:36

标签: c bits

我负责编写一个方法,该方法“返回所有偶数位设置为1的字。”对C来说是全新的,这似乎令人困惑和不清楚。我不明白我怎么能用C改变一个数字的位。这看起来像一个非常低级别的指令,我甚至不知道如何用Java(我的第一语言)做到这一点!有人可以帮帮我吗!这是方法签名。

int evenBits(void){
    return 0;
}

任何有关如何执行此操作的说明,甚至是如何开始这样做的指导都将非常感激。非常感谢你!

3 个答案:

答案 0 :(得分:1)

将其分解为两个问题。

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

提示:使用按位运算符。

(2)如何找出“所有偶数位”的表示,以便我可以使用按位运算符来设置它们?

提示:使用数学。 ;-)你可以创建一个表(或找到一个),如:

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

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

答案 1 :(得分:0)

您必须准确定义所有偶数位。位在不同的体系结构上以不同的方式编号。硬件人员喜欢将它们从最低有效位到最高有效位从132进行编号,或者有时从最重要位到最低位进行编号...而软件人员喜欢通过增加从0开始的顺序来对位进行编号,因为位0表示数字2 0 ,即:1。

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

对于本答案的其余部分,我将假设偶数位是表示2的偶数幂的位:1(2 0 ),4(2 2 ),16(2 4 )...

这个问题的简短答案是:

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标准允许实现一个或多个无效的实现。

答案 2 :(得分:0)

所以基本上所有其他位都必须设置为1?这就是我们在C中进行按位操作的原因。想象一下常规的比特阵。你想要的是最合适的位,并将其设置为1(这是数字2)。然后我们只使用OR运算符(|)来修改现有的数字。这样做之后。我们将位数向左移位2位(&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;&lt下面的代码更好地描述了它。

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

以下是Bitwise Operations in C

的链接