我正在查看包含此语句的一些C代码。
if (
((uint8_t *)row)[byte] & (1 << (8-bit))
)
value |= (value + 1);
将指针和整数的AND放在条件括号内是什么意思和目的?
答案 0 :(得分:2)
在其他情况下,有意义,但这不是在这里发生的事情。
它将row
(我假设是某种指针)转换为uint8_t *
,然后在该数组中挑选byte
- uint8_t
。 那个然后按向左移位的东西进行按位。
它在逻辑上与:
相同uint8_t shifted = (1 << (8 - bit))
uint8_t *rowptr = (uint8_t *)row;
uint8_t rowval = rowptr[byte];
uint8_t combined = (rowval & shifted);
if (combined) // or, if (combined != 0)
value |= (value + 1);
答案 1 :(得分:1)
我相信这种情况是为了检查特定位是否打开。
答案 2 :(得分:1)
它正在测试row[byte]
的第7位是否设置。 &
二元运算符是按位AND
运算符,而不是逻辑AND运算符。 1<<(8-bit)
是一种常用于生成位掩码以隔离一位的表达式。
row
可能是通用指针,因此(uint8_t *)row
用于将此指针强制转换为字节数组的指针。
答案 3 :(得分:1)
这不是指针的AND。你有一个指针,然后你在起始位置之上[字节] 正在进行AND运算。
答案 4 :(得分:1)
这不是它正在做的事情。
(uint8_t *)row
将行转换为指向无符号字节
((uint8_t *)row)[byte]
...并应用数组寻址从那里检索无符号字节byte
字节。 (数组寻址和指针数学有些可互换; pointerval[intval]
与*(pointerval + intval)
意思相同。
这意味着
((uint8_t *)row)[byte] & (1 << (8-bit))
从行中检索byte
无符号字节,并屏蔽除bit
位以外的所有字符。
最后,把它们放在一起,
if ( ((uint8_t *)row)[byte] & (1 << (8-bit)) )
测试表达式的结果是否为真(非零)。
因此,这是在询问行中特定字节的特定位是否为非零。