2017-08-18 35 views
2

我想知道如何删除位值中的位。如何忽略变量中的位

我收到一个10位的值(位0到位9),我必须发送一个忽略接收值的位0,位2,位4和位6的变量,那么我的变量将是:位987531。我能怎么做 ?我听说过屏蔽位我真的不知道如何使用它,即使我知道面具将0x55的

谢谢你帮我

+0

实际上,这是通常掩码的*补码 - 掩码会告诉哪些位要保留。 –

+0

https://stackoverflow.com/questions/10493411/what-is-bit-masking –

+0

@ tilz0R这不是重复的,因为OP想要删除位,而不是简单地清除它们。一些转变将需要发生。 – dasblinkenlight

回答

2

始终使用5位的一个解决办法是

new_value = ((data & 0x002) >> 1) | 
      ((data & 0x008) >> 2) | 
      ((data & 0x020) >> 3) | 
      ((data & 0x080) >> 4) | 
      ((data & 0x200) >> 5); 

但这里是另一种解决方案的使用固定数量的而不是位(即5在你的情况)使用一个函数,允许你指定要保留的位数。

这可能是这样的:

#include <stdio.h> 
#include <stdlib.h> 

unsigned keepOddBits(const unsigned data, const unsigned number_of_bits_to_keep) 
{ 
    unsigned new_value = 0; 
    unsigned mask = 0x2; 
    int i; 
    for (i=0; i < number_of_bits_to_keep; ++i) 
    { 
    if (mask & data) 
    { 
     new_value = new_value | ((mask & data) >> (i + 1)); 
    } 
    mask = mask << 2; 
    } 
    return new_value; 
} 

int main() 
{ 
    printf("data 0x%x becomes 0x%x\n", 0x3ff, keepOddBits(0x3ff, 5)); 
    printf("data 0x%x becomes 0x%x\n", 0x2aa, keepOddBits(0x2aa, 5)); 
    printf("data 0x%x becomes 0x%x\n", 0x155, keepOddBits(0x155, 5)); 
    return 0; 
} 

输出

data 0x3ff becomes 0x1f 
data 0x2aa becomes 0x1f 
data 0x155 becomes 0x0 

更改main要求3而不是5位的,如:

int main() 
{ 
    printf("data 0x%x becomes 0x%x\n", 0x3ff, keepOddBits(0x3ff, 3)); 
    printf("data 0x%x becomes 0x%x\n", 0x2aa, keepOddBits(0x2aa, 3)); 
    printf("data 0x%x becomes 0x%x\n", 0x155, keepOddBits(0x155, 3)); 
    return 0; 
} 

输出

data 0x3ff becomes 0x7 
data 0x2aa becomes 0x7 
data 0x155 becomes 0x0 
+0

@ user8451061我注意到你刚刚接受了我的回答。我实际上即将删除它,因为我认为它是错误的。我的答案**只保留**奇数编​​号**位。在再次阅读您的问题之后,您似乎想保留第8位(?)。我的代码不**保留位数8.你确定这是你想接受的答案吗? – 4386427

3

像下面手动创建位一起:

//Option 1 
uint8_t result = 0; 
result |= (inputValue >> 1) & 1; 
result |= ((inputValue >> 3) & 1) << 1; 
result |= ((inputValue >> 5) & 1) << 2; 
result |= ((inputValue >> 7) & 1) << 3; 
result |= ((inputValue >> 8) & 1) << 4; 
result |= ((inputValue >> 9) & 1) << 5; 
3

我闻到嵌入式:)我不能保证可移植性(但大多数编译器,我知道,它会做)

union 
{ 
    struct 
    { 
     unsigned b0 : 1; 
     unsigned b1 : 1; 
     unsigned b2 : 1; 
     unsigned b3 : 1; 
     unsigned b4 : 1; 
     unsigned b5 : 1; 
     unsigned b6 : 1; 

     unsigned bx : 3; 
    } 
    uint16_t raw; 
}raw; 

    raw.raw = value; 

    uint8_t without_skipped = raw.b1 | (raw.b3 << 1) | (raw.b5 << 2) | (raw.bx << 3) ; 

这是小尾数

大端扭转结构和无名bitfild到PADD