有没有办法操纵我在C中移位的位

时间:2017-01-17 22:26:05

标签: c bit

如果我有一个int a,可以说等于0。 有没有办法让我说左移101进入变量,然后在011的另一个步骤转移到它?然后我可以在最后得到int十进制数?它最终会变成0b00000000000000000000000000101011。或者我应该只使用OR操作。

5 个答案:

答案 0 :(得分:4)

您无法将位移入变量;你可以在他们的OR:

int a = 0;
a |= 5;
printf("a = %d\n", a);
a <<= 3;
a |= 3;
printf("a = %d\n", a);

如果你的系统支持二进制常量,你可以使用那些而不是小数(你可以使用0作为八进制的前缀为5和3,如果你愿意,你可以使用0x作为十六进制 - 你可以使用根据品味的不同格式)。如果a的起始值未知为0,则您将在第一次|=操作之前执行轮班分配操作。

最后,您必须担心左移有符号整数值,以便发生溢出 - 这会导致未定义的行为。但问题中的值不是问题。

答案 1 :(得分:2)

您需要先移位所需的位数,然后对新数据执行按位OR运算。

int a = 0;
a = a << 3;
a = a | 0x5;
a = a << 3;
a = a | 0x3;
printf("a=%x\n", a);

(使用单独的赋值和运算符代替复合运算符,使初学者更清楚。)

结果:

a=2b

答案 2 :(得分:1)

  

我有没有办法让左移101进入变量

没有。您需要先左移,然后添加(或OR)新值。

int eax = 0;
eax <<= 3;
eax |= 5;

答案 3 :(得分:0)

class Foo {
  init() {
    console.log("A");
    console.log("B");
    this.doX();
    console.log("C");
  }
  doX(){}
}

class Bar extends Foo {
  doX() {
    console.log("X");
  }
}

new Bar().init();

没有一种预先定义的方式来“移入”这样的值。编写可能的函数不会花费太多时间。

答案 4 :(得分:0)

据我所知 - 没有任何操作可以将一个位从一个整数“移位”到另一个整数。左移位运算符总是使用0填充生成的空格,这样您就必须将它与例如| - 操作相结合(实际上+具有相同的效果你的情况)。

#include <stdio.h>

void printBinary(int b, int nrOfBits) {
    for (int mask = (1 << nrOfBits); mask != 0; mask >>=1 ) {
        char c = (b & mask) ? '1' : '0';
        printf("%c", c);
    }
}

int main()
{
    int a = 0;
    a = (a << 3) | 0x5;
    printBinary(a, 8);printf("\n");
    a = (a << 3) | 0x3;
    printBinary(a, 8);printf("\n");

    return 0;
}

在有符号数据类型上使用左移运算符时,请注意不要产生未定义的行为(参见cppreference concerting arithmetic operations):

  

当有符号整数算术运算溢出时(结果确实如此)   不适合结果类型),行为未定义