我有:
int8_t byteFlag;
我想得到它的第一点?我想我可能需要使用&
,>>
但不确定如何使用。有什么帮助吗?
int func(int8_t byteFlag, int whichBit)
{
if (whichBit > 0 && whichBit <= 8)
return (byteFlag & (1<<(whichBit-1)));
else
return 0;
}
现在func(byteFlag, 1)
将从 LSB 返回第一个位。您可以通过8
aswhichBit
获得第 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
。
您将使用 & 运算符。
如果“第一位”是指 LSB:
int firstBit = byteFlag & 1;
如果“第一位”是指 MSB:
int firstBit = byteFlag >> (sizeof(byteFlag) * 8 - 1);
只是掩盖高位
int8_t high_bit = byteFlag & (1 << 7); //either 1 or 0
另一个技巧,因为这是一个有符号整数
if (byteFlag < 0) firstBitSet = true;
最后一个之所以起作用,是因为二进制补码中的数字表示。如果数字为负数,则设置高位。
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. */
解决方案如下。要获得数字的第一位,请设置 bit = 1;
int bitvalue(int8_t num, int bit)
{
if (bit > 0 && bit <= 8)
return ( (num >> (bit-1)) & 1 );
else
return 0;
}