代码之家  ›  专栏  ›  技术社区  ›  Nicolas

C操作位串中的位

  •  2
  • Nicolas  · 技术社区  · 9 年前

    我目前正在处理一个问题,我试图在一个位串中操纵位。

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

    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 回复  |  直到 9 年前
        1
  •  2
  •   Paul    9 年前

    如果我正确地解释了你的问题,你只想做一点 a signal :

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

    对于值 a = 41 signal = 2 以上将输出 Signal bit is not set 自从 41 没有位设置在与信号相同的位置。

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

        2
  •  2
  •   chqrlie    9 年前

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

    const char *maskstring = "00101001";
    unsigned int mask = strtol(maskstring, NULL, 2);
    
    printf("hexmask for binary %s is %#x\n, maskstring, mask);
    

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

        3
  •  0
  •   didierc    9 年前

    该程序的目的是获取给定的信号编号,将除作为信号编号的数字位之外的所有位设置为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;
    

    }

        4
  •  0
  •   user3629249    9 年前
    // 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
    
    }