C操作位字符串中的位

时间:2015-02-27 01:11:37

标签: c string binary bit

我目前正在研究一个问题,即我试图操作位串中的位。

我正在尝试使用以下信号掩码:

00101001

并使用AND和OR运算符对作为整数给出的信号掩码进行检查。

我目前有一些代码采用无符号字符并打印出二进制表示,但我不知道如何继续。

main() {
    int signal = 2;
    unsigned char a = 41;

    int i;
    for (i = 0; i < 8; i++) {
        printf("%d \n", !!((a << i) & 0x80));
    }
    printf("\n");

    return 0;
}
  • 程序的目的应该是给出给定的信号编号,除了作为信号编号的编号位之外,将所有位设置为0,并使用AND运算符来查明信号是否已设置根据值是0还是1.

注意:在运行时只会检查一个给定的信号编号。

有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

如果我正确地解释了您的问题,那么您想做的只是按位,并且在asignal之间:

if ( a & signal ) {
    printf( "Signal bit is set\n" );
} else {
    printf( "Signal bit is not set\n" );
}

对于值a = 41signal = 2,上面会输出Signal bit is not set,因为41没有设置与信号位置相同的位。

如果a = 42a = 43输出Signal bit is set

答案 1 :(得分:2)

如果信号掩码以二进制表示形式作为字符串提供给程序,则可以使用strtol进行转换:

const char *maskstring = "00101001";
unsigned int mask = strtol(maskstring, NULL, 2);

printf("hexmask for binary %s is %#x\n, maskstring, mask);

如果掩码是常量,请自行转换并使用十六进制值。

答案 2 :(得分:0)

// input integer with current signal bits
unsigned int signalBits = atoi(signalString);

unsigned int signalOfInterest;
// note signalOfInterest will contain a 'power of 2' value
// such as 1 or 2 or 4 or 8 or 16 or 32 or 64, etc
// which represent the various possible signal bits

// test if signal bit is set
if( signalBits&signalOfInterest )
{ // then signal bit is set

}
else
{ // else, signal bit is not set

}

答案 3 :(得分:0)

  

程序的目的应该是给出给定的信号编号,除了作为信号编号的数字位之外,将所有位设置为0,并使用AND运算符根据是否设置信号来确定信号是否设置值为0或1。

您希望从信号编号 n 中获取位掩码,这可以通过将1左移到第n 位置来实现。然后应用简单的&(按位和)来检查该位是否已设置。

int checkSignal(unsigned int value, unsigned char signalNumber){
  unsigned int bitMask = 1 << signalNumber;
  return (value & bitMask) != 0;
}

signalNumber存储为单个字节,假设int位大小不能大于255;理想情况下,您应检查它是否不大于sizeof(int) * 8

请注意,第一个信号位在索引0处,因此根据编号约定,您可能需要将1移除到信号编号。

int checkSignal(unsigned int value, unsigned char signalNumber){
  unsigned int bitMask = 1 << (signalNumber - 1); // number starts at 1
  return (value & bitMask) != 0;
}

测试:

main() {
  int signal = 2;
  unsigned char a = 41;

  /*
  int i;
  for (i = 0; i < 8; i++) {
      printf("%d \n", !!((a << i) & 0x80));
  }
  printf("\n");
  */

  printf("%dth bit of %d is %s set\n", signal, a, checkSignal(a, signal)?"":"not"); 

  return 0;

}