如果Conditional包含指针和整数的AND

时间:2014-02-03 20:59:03

标签: c if-statement

我正在查看包含此语句的一些C代码。

if (
     ((uint8_t *)row)[byte] & (1 << (8-bit))
   ) 
value |= (value + 1);

将指针和整数的AND放在条件括号内是什么意思和目的?

5 个答案:

答案 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)) )

测试表达式的结果是否为真(非零)。

因此,这是在询问行中特定字节的特定位是否为非零。