【问题标题】:Meaning of the statement in CC中语句的含义
【发布时间】:2014-05-16 08:46:27
【问题描述】:

你能给我一些关于代码的想法吗?

C 代码:

while((INT_STATUS() & ISR_RX_MASK)
       ||(event & TIMER_EXPIRED)
       ||(event & MEM_BLOCK_AVAILABLE))
{.........

这里:

event is UNT32 local variable in function   

INT_STATUS() = Some Address location

ISR_RX_MASK = 0x01 (Some value in HEX)
TIMER_EXPIRED = 0x02 (Some value in HEX)
MEM_BLOCK_AVAILABLE = 0x03 (Some value in HEX)

谢谢。

【问题讨论】:

  • 我猜MEM_BLOCK_AVAILABLE实际上是0x04...
  • 你知道按位运算符(如按位与)吗?你知道逻辑运算符(如逻辑或)吗?如果没有,那么我建议您找一本好书并阅读这些内容。
  • 查一下 C 中的按位运算,你应该能看懂这段代码了。

标签: c while-loop


【解决方案1】:
while((INT_STATUS() & ISR_RX_MASK) ||(event & TIMER_EXPIRED) ||(event & MEM_BLOCK_AVAILABLE))

如果出现以下任一情况,则继续循环

1) 在 INT_STATUS() 函数的返回值和 ISR_RX_MASK 之间执行逻辑与运算后的结果为真,我假设这是检查某些中断条件

2) 在变量 event(我假设这包含某个寄存器的值)与 TIMER_EXPIRED 十六进制值之间执行逻辑与运算后的结果为 TRUE。也就是说,Timer Expire 的指示标志将在第 1 位(0000 0010)

3) 在变量 event(我假设这包含某个寄存器的值)与 MEM_BLOCK_AVAILABLE 十六进制值为 TRUE 之间执行逻辑与运算后的结果。也就是说,可用内存块的指示标志将在第 0 位和第 1 位位置 (0000 0011)

【讨论】:

    【解决方案2】:

    一开始你可能会对binary numbers representation感兴趣。

    我建议MEM_BLOCK_AVAILABLE 实际上是0x04 而不是0x03,更多信息如下。

    在二进制中(0x 表示数字以十六进制表示,但由于以下所有数字都小于 10,因此它们也可以以十进制显示 - 但我们通常使用十六进制或八进制来编写感兴趣的数字文字它们的二进制表示),我们有

    Hexa    Binary
    0x01 is 0001
    0x02 is 0010
    0x03 is 0011
    0x04 is 0100 ...
    

    两个数字 A 和 B 之间的 bitwise operator & 保留了 1,即二进制的两个数字在同一位置

    喜欢(二进制表示)

     dcba   dcba
     0110 & 0011 gives 0010 since only the 1 at position b is in both numbers
    

    最后while( expr ) 循环,而expr 不为零。因此,在两个数字之间执行& 会得到一个结果(expr),其中至少有一个1(非零)或没有1(零)。因此有while 循环(非零)或结束(零)。

    在你的情况下,做

    while((INT_STATUS() & ISR_RX_MASK)
       ||(event & TIMER_EXPIRED)
       ||(event & MEM_BLOCK_AVAILABLE))
    

    表示while 循环,如果三个表达式中的任何一个不为零(真),|| 表示逻辑或。假设 ISR_RX_MASK 是 1,TIMER_EXPIRED 是 2,MEM_BLOCK_AVAILABLE 是(我假设)4,你会得到 while 表达式

    (INT_STATUS() & 1)
    ||
    (event & 2)
    ||
    (event & 4)
    

    意思是while 继续如果来自INT_STATUS & 1 的结果,即它的第一位(右侧)是1(或我的dcba 中的a上面显示的符号),或者如果事件的第二位(或我的 dbca 符号中的 b)是1(从右边开始),或者如果第三位(或 c 在我的 dcba 表示法中)的事件是1

    例如,如果 INT_STATUS 是 14,即二进制的 1110,它的第一位是 0,因此 INT_STATUS() & 1 将产生 0

    我假设 MEM_BLOCK_AVAILABLE 是 4(或 2 > 2 的另一个幂)而不是 3 的原因是因为如果它是 3,或者二进制的 0011,当 event & 3 为真时,前一个 event & 2 将始终为真,因此在这种情况下没有意义。而且 MEM_BLOCK_AVAILABLE 和 TIMER_EXPIRED 似乎没有关联,根据它们的名称,这是主观的,但是......

    【讨论】:

      【解决方案3】:

      当 INT_STATUS() 的第 0 位为 1,或事件的第 1 位,或事件的第 2 位设置为 1 时,循环将执行

      【讨论】:

        猜你喜欢
        • 2011-09-03
        • 2010-12-17
        • 1970-01-01
        • 2023-03-28
        • 2020-09-23
        • 1970-01-01
        • 1970-01-01
        • 2014-06-14
        • 1970-01-01
        相关资源
        最近更新 更多