2011-07-21 31 views
5

Código original (VB.NET):AND bit a bit/NO de VB.NET a C#

curStyle = curStyle And (Not ES_NUMBER) 

código modificado (C#):

curStyle = curStyle & (!ES_NUMBER); 

Pero es que me da este error:

Operator '!' cannot be applied to operand of type 'long'

ES_NUMBER es del tipo de datos long. Intenté cambiarlo a int, string, etc. Todo no funciona.

¿Cómo resuelvo este problema?

+0

¿Qué tipo es curStyle? –

+0

Obtener reflector. Le mostrará esta y muchas otras traducciones. –

+0

'~' es el operador de complemento bit a bit, que voltea cada bit en el operando. –

Respuesta

8

And es lo mismo que &; lo tienes correctamente Not delante de Long es un operador NOT bit a bit. El equivalente de C# es ~.

El código C# sería:

curStyle = curStyle & (­~ES_NUMBER); 

Salida Bitwise operators in c# OR(|), XOR(^), AND(&), NOT(~), explicando los operadores bit a bit C#.

+0

Sí, funciona! ¡¡Hurra!! Muchas gracias, amigo! :) –

+0

También podría escribir 'curStyle & = ~ ES_NUMBER;'. –

0

Un signo de unión único suele ser una operación de poco sentido, pero la exclamación es una operación lógica. Es necesario utilizar two ampersands a la C++ si quieres un AND lógico:

curStyle = curStyle && (!ES_NUMBER); 

O una tilde si quieres un AND de bits:

curStyle = curStyle & (~ES_NUMBER); 
+0

Una sola marca comercial no siempre es un poco sabio y. Considera (verdadero y falso) que es un y lógico. –

+0

¡El OP está * intentando * hacer una manipulación de bits! – Gabe

+0

@Gabe: Sí, solo busqué las palabras clave 'Y' y' No' en VB. Es interesante que funcionen implícitamente. –

2

Una vez más, un viaje a la documentación de prueba de instrucción:

From MSDN:

The logical negation operator (!) ... is defined for bool and returns true if and only if its operand is false.

No hay nada en la documentación acerca de ningún comportamiento en absoluto para las expresiones numéricas, lo que supondría que el operador no está definido para trabajar con esas expresiones.

Por otro lado, MSDN has this to say about VB.NET's Not operator:

For numeric expressions, the Not operator inverts the bit values of any numeric expression and sets the corresponding bit in result according to the following table...

Así que la pregunta es ahora: ¿Cómo reproducir el comportamiento de VB.NET de "No" para C#? Afortunadamente, no es difícil: puede usar el ~ operator.

curStyle = curStyle & (­~ES_NUMBER); 

Y, sólo por si acaso, el documentation on &:

For integral types, & computes the bitwise AND of its operands.

0

La cuestión clave es (y la respuesta a la que no se proporciona): ¿Es curStyle un entero o un bool? ¿Estás tratando de obtener un valor de verdad (bool, verdadero/falso), o estás tratando de enmascarar bits en un campo de bits?

Para el primer caso, donde curStyle es un (valor de verdad) bool, que dicen:

curStyle = curStyle && !ES_NUMBER ; 

El último caso, cuando curStyle es un tipo entero y se quiere manipular sus bits, toma:

curStyle = curStyle & ~Not ES_NUMBER ; 
+0

ES_NUMBER es un largo. Por lo tanto, (No ES_NUMBER) es largo. Lo que a su vez significa que curStyle debe ser largo si se usa la verificación de tipo estricta. –