¿Qué significa una sola barra vertical en C

Alguien me mostró el siguiente fragmento de código y me preguntó qué significaba:

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

Y me quedé atascado en las barras verticales independientes. Sé que dos juntos significan “o” pero solo uno, ¿qué significa eso?

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

Supongo que quien te mostró la línea en cuestión significaba un valor absoluto.

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

Oh! Una sola barra vertical significa bit a bit o .

Una barra por sí misma significa “OR a nivel de bit” (a diferencia de la barra doble que significa “OR lógica”)

  1 | 1 == 1 0 | 1 == 1 1 | 0 == 1 0 | 0 == 0 true || true == true false || true == true 01 | 10 == 11 01 || 10 == true 

Sin embargo, las barras verticales en su muestra, por lo que puedo decir, son errores de syntax. Parece que el autor va por “valor absoluto”, que usaría barras verticales (por escrito o pseudo-código) pero no en ningún lenguaje informático que conozca.

Bitwise inclusive o:

El operador OR inclusivo a nivel de bit compara cada bit de su primer operando con el bit correspondiente de su segundo operando. Si cualquiera de los bits es 1, el bit de resultado correspondiente se establece en 1. De lo contrario, el bit de resultado correspondiente se establece en 0.

Fuente

Es un operador de bit a bit o

Es un OR de bit a bit. Esencialmente toma los dos valores y los ORs de cada uno de los bits correspondientes en sus representaciones binarias:

 10010001 01001010 -------- 11011011 

Si el bit de cualquiera de los operandos es un 1, el bit de la respuesta en ese lugar es uno. Si ninguno de los dos es 1, la respuesta tiene un 0 allí.

Dale dijo que sabía que significaba “o” con dos operandos. Su pregunta es qué significa cuando se utiliza como operador unario. La respuesta corta es que no significa nada en C / C ++.

En algunos idiomas (como Verilog para hardware de encoding) esto es una reducción o, lo que resulta en un 1 si cualquier bit es uno.

Así que creo que este es un error de syntax a menos que sea algo gracioso estar sobrecargando los paréntesis que no puedo entender.

Su código no es válido C, a menos que se coloque en un contexto específico (y bastante artificial). Operador | Es un operador binario. Es un bit o, como parece que ya sabes. Por sí mismo, no se puede utilizar de la forma en que se usa en su código.

Si uno quisiera forzar este código para comstackrlo como código C, probablemente tendría que definir FBMap como una macro. Algo como

 #define FBMap(x) something_else(abs(0 x 0)) 

tratando de emular al operador matemático de “valor absoluto” | | | | . Tu llamada se expandirá a

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

haciendo así la aplicación de | Operador válido.

Pero incluso después de eso necesitarías something_else para ser un puntero de función en esa estructura *pFCT , ya que la llamada se ve muy *pFCT como una llamada al método C ++. Su pregunta está etiquetada como C, por lo que la única manera de hacer que funcione en C es introducir un miembro de puntero de función en la estructura.