单个垂直条在C中的含义是什么

时间:2010-10-05 16:01:08

标签: c

有人向我展示了以下代码段并询问其含义:

if (!pFCT->FBMap(| ( VBQNum - 1 ) / 8 |) & (1 << (7 - ( ( VBQNum - 1 ) % 8)))))
{
    stuff
}

我被困在独立的竖条上。我知道两个人的意思是“或”而只是一个,这意味着什么。

7 个答案:

答案 0 :(得分:16)

if (!pFCT->FBMap(| ( VBQNum - 1 ) / 8 |) & (1 << (7 - ( ( VBQNum - 1 ) % 8))))) { stuff }
/*              ^^^   syntax error   ^^^                               */

我想无论谁向你展示有问题的线都意味着绝对值

if (!pFCT->FBMap(abs( ( VBQNum - 1 ) / 8 )) & (1 << (7 - ( ( VBQNum - 1 ) % 8))))) { stuff }
/*              ^^^^^^                  ^^^                            */

哦!单个垂直条表示按位或

答案 1 :(得分:12)

一个条形本身就意味着“按位OR”(而不是双条形,意思是“逻辑OR”)

 1 | 1 == 1
 0 | 1 == 1
 1 | 0 == 1
 0 | 0 == 0
 true || true  == true
 false || true == true


 01 | 10 == 11
 01 || 10 == true

但是,据我所知,样本中的竖条是语法错误。看起来作者想要“绝对价值”,它会使用垂直条 - 写作或伪代码 - 而不是我所知道的任何计算机语言。

答案 2 :(得分:6)

按位包含或:

  

按位包含OR运算符将其第一个操作数的每个位与其第二个操作数的相应位进行比较。如果任一位为1,则相应的结果位设置为1.否则,相应的结果位设置为0.

Source

答案 3 :(得分:3)

答案 4 :(得分:3)

这是一个按位OR。 本质上,它采用二进制表示中的每个相应位的两个值和OR:

10010001
01001010
--------
11011011

如果任一操作数的位为1,则该位置的答案位为1。如果两者都不是1,则答案为0。

答案 5 :(得分:2)

戴尔说他知道这意味着“或”有两个操作数。他的问题是当作为一元运算符使用时意味着什么。简短的回答是它在C / C ++中没有任何意义。

在某些语言中(如用于编码硬件的Verilog),这是一个或减少,如果任何一个是1,则会产生1。

所以我认为这是一个语法错误,除非是重载括号的一些有趣的东西,我无法理解。

答案 6 :(得分:1)

您的代码无效C,除非置于特定(且相当人为)的上下文中。运算符|是二元运算符。这是一个按位 - 或者,你似乎已经知道了。就其本身而言,它不能以您在代码中使用的方式使用。

如果有人想强制将此代码编译为C代码,则可能必须将FBMap定义为宏。像

这样的东西
#define FBMap(x) something_else(abs(0 x 0))

因此试图模拟数学“绝对值”运算符| |。您的电话将扩展为

pFCT->something_else(abs(0 | ( VBQNum - 1 ) / 8 | 0))

因此使|运算符的应用有效。

但即使在那之后你需要something_else成为*pFCT结构中的函数指针,因为调用看起来非常像C ++方法调用。你的问题被标记为C,所以使它在C中工作的唯一方法是将一个函数指针成员引入结构中。