5

我有:

int8_t byteFlag;

我想得到它的第一点?我想我可能需要使用&>>但不确定如何使用。有什么帮助吗?

4

5 回答 5

9
int func(int8_t byteFlag, int whichBit)
{
    if (whichBit > 0 && whichBit <= 8)
        return (byteFlag & (1<<(whichBit-1)));
    else
        return 0;
}

现在func(byteFlag, 1)将从 LSB 返回第一个位。您可以通过8aswhichBit获得第 8 位 (MSB)。

<<是一个左移操作符。它会将值转移1到适当的位置,然后我们必须执行&操作以获取byteFlag.

为了func(75, 4)

75         -> 0100 1011
1          -> 0000 0001
1 << (4-1) -> 0000 1000 //means 3 times shifting left

75 & (1 << (4 - 1))会给我们1

于 2013-01-25T18:43:16.703 回答
3

您将使用 & 运算符。

如果“第一位”是指 LSB:

int firstBit = byteFlag & 1;

如果“第一位”是指 MSB:

int firstBit = byteFlag >> (sizeof(byteFlag) * 8 - 1);
于 2013-01-25T18:39:08.787 回答
3

只是掩盖高位

int8_t high_bit = byteFlag & (1 << 7); //either 1 or 0

另一个技巧,因为这是一个有符号整数

if (byteFlag < 0) firstBitSet = true;

最后一个之所以起作用,是因为二进制补码中的数字表示。如果数字为负数,则设置高位。

于 2013-01-25T18:39:09.207 回答
0
int8_t bit_value = (byteFlag & (1U << bitPosition)) ? 1 : 0 ;
/* now it's up to you to decide which bit is the "first".
   bitPosition = 0 is the minor bit. */
于 2013-01-25T18:42:01.423 回答
0

解决方案如下。要获得数字的第一位,请设置 bit = 1;

int bitvalue(int8_t num, int bit)
{
    if (bit > 0 && bit <= 8)
        return ( (num >> (bit-1)) & 1 );
    else
        return 0;
}
于 2014-09-08T20:02:06.517 回答