有人向我展示了以下代码段并询问其含义:
if (!pFCT->FBMap(| ( VBQNum - 1 ) / 8 |) & (1 << (7 - ( ( VBQNum - 1 ) % 8)))))
{
stuff
}
我被困在独立的竖条上。我知道两个人的意思是“或”而只是一个,这意味着什么。
答案 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)
答案 3 :(得分:3)
答案 4 :(得分:3)
这是一个按位OR。 本质上,它采用二进制表示中的每个相应位的两个值和OR:
10010001
01001010
--------
11011011
如果任一操作数的位为1,则该位置的答案位为1。如果两者都不是1,则答案为0。
答案 5 :(得分:2)
在某些语言中(如用于编码硬件的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中工作的唯一方法是将一个函数指针成员引入结构中。