我想在整数变量中提取特定范围的位。
例如:0xA5(10100101)
我想从bit2提取到bit5。即1001到它们之间的变量和计数零。
我有另一个给出起点的变量,这意味着在这种情况下变量的值是2.所以起点可以找到0xA5>> 2。 第5位位置在这里是一个随机位置。意思是它可以是6或7.主要思想是在第2位之后将任何位设置为1。我必须提取..
我该如何做剩下的部分?
答案 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.
答案 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 |
-----------------------