提取特定范围的位并在C中找到它们之间的零数

时间:2018-02-07 08:36:15

标签: c

我想在整数变量中提取特定范围的位。

例如:0xA5(10100101)

我想从bit2提取到bit5。即1001到它们之间的变量和计数零。

我有另一个给出起点的变量,这意味着在这种情况下变量的值是2.所以起点可以找到0xA5>> 2。 第5位位置在这里是一个随机位置。意思是它可以是6或7.主要思想是在第2位之后将任何位设置为1。我必须提取..

我该如何做剩下的部分?

6 个答案:

答案 0 :(得分:2)

假设您正在为您的变量处理-1。 您将不得不构建适当的掩码。

假设您想要从位置unsigned int到位置x的位,掩码中需要y y - x + 1

你可以通过 -

得到这个
1s

现在您需要从初始编号中删除较低的int digits = y - x + 1; unsigned int mask = 1u << digits - 1; 位,这些位由 -

完成
x

最后应用遮罩去除高位 -

unsigned int result = number >> x;

答案 1 :(得分:1)

你可以使用面具和&#34;&amp;&#34; (AND)操作:

a = 0xA5;
a = a >> OFFSET; //OFFSET 
mask = 0x0F; // equals 00001111
a = a & mask; 

在您的示例中a = 0xA5(10100101),偏移量为2.

  • a&gt;&gt; 2 a现在等于0x29(00101001)
  • a&amp; 0x0F(00101001 AND 00001111)= 00001001 = 0x09

答案 2 :(得分:1)

在这个例子中,我们将0或1个值放入数组中。之后,您可以根据需要处理数组。

#include <stdio.h>
#include <stdint.h>

int main(int argc, char **argv) {
    uint8_t value = 0xA5;
    unsigned char bytes[8];
    unsigned char i;

    for (i = 0; i < 8; i++) {
        bytes[i] = (value & (1 << i)) != 0 ? 1 : 0;
    }

    for (i = 0; i < 8; i++) {
        printf("%d", bytes[i]);
    }

    return 0;
}

答案 3 :(得分:1)

如果您想要偏移X的位,则向右移动X

如果你想要Y位,那么掩码(移位后)将为2 Y减去1的幂(对于你的例子有4位,2到4的幂是16,减1是15,1111二进制)。这可以通过使用左移Y位并减去1来实现圆顶。

但是,如果要计算所需位中的零数,只计算右移,则不需要屏蔽。循环Y次,每次将1左移一步,并使用按位检查,如果值为零。如果是则增加一个计数器。在循环结束时,计数器是零的数量。

把它全部放在代码中:

// Count the number of zeros in a specific amount of bits starting at a specific offset
// value is the original value
// offset is the offset in bits
// bits is the number of bits to check
unsigned int count_zeros(unsigned int value, unsigned int offset, unsigned int bits)
{
    // Get the bits we're interested in the rightmost position
    value >>= offset;

    unsigned int counter = 0;  // Zero-counter
    for (unsigned int i = 0; i < bits; ++i)
    {
        if ((value & (1 << i)) == 0)
        {
            ++counter;  // Bit is a zero
        }
    }

    return counter;
}

要使用您拥有的示例数据:

count_zeros(0xa5, 2, 4);

结果应为2。它是if you see this live program

答案 4 :(得分:1)

int32_t do_test(int32_t value, int32_t offset)
{
    int32_t _zeros = 1;
    value >>= offset;    

    int i = 1;

    while(1) {
        if((value >> i) % 2 == 0) {
            _zeros += 1;
            i++;
        } else {
            break;
        }
    }
}

答案 5 :(得分:0)

int result = (0xA5 >> 2) & 0x0F;

&运算符的真值表

 |    INPUTS  | OUTPUT |
 -----------------------
 |  0   |  0  |    0   |
 |  0   |  1  |    0   |
 |  1   |  0  |    0   |  
 |  1   |  1  |    1   |
 -----------------------