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

如何在MSB处插入新位并忽略所有其他位

  •  0
  • NaturalDemon  · 技术社区  · 2 年前

    我发现了这个: add a new bit to the left of byte and discard right bit of byte 但是:

    x = 0x80000000 | (x >> 1);
    

    不会缝合我要找的东西。

    union {
      unsigned char byte_variable;
      // a structure with 8 single bit bit-field objects, overlapping the union member "byte"
      struct {
                    unsigned b0: 1;
                    unsigned b1: 1;
                    unsigned b2: 1;
                    unsigned b3: 1;
                    unsigned b4: 1;
                    unsigned b5: 1;
                    unsigned b6: 1;
                    unsigned b7: 1;
      };
    } byte_8;
    

    显然设置有点像这样:

    byte_8.b7 = 1;
    

    如果你使用工会就不起作用。

    如何在MSB处添加新位,并忽略或不更改变量中的所有其他位。

    byte_8.byte_variable;
    
    2 回复  |  直到 2 年前
        1
  •  2
  •   dbush    2 年前

    联合中位字段的排序是由实现定义的,因此您尝试的操作不能保证有效。

    如果您想在 unsigned char ,只需将变量与仅设置了该位的值进行OR运算:

    unsigned char x;
    // set x
    x = x | 0x80;
    
        2
  •  0
  •   Daniele Affinita    2 年前

    如果你想要一个更通用的方法来设置msb,你可以这样做:

    int setMSB(int x, int b){
        return b ? x | (1 << sizeof(x)*8-1) : x & ~(1 << sizeof(x)*8-1);
    }
    

    其中x是数字(您可以根据需要修改x数据类型),b是要放入的位。请注意,检查b是0还是1可能是安全的(或者更好地使用布尔值)。

    如果您设置b=1,则变量变为x|100…通过这种方式,您可以设置msb以保持其他位的一致性(正如其他用户已经建议的那样)。

    否则,如果设置b=0,则变量变为x&011…msb将为0,而其他位不会更改其值