2011-07-21 11 views
5

Codice originale (VB.NET):Conversione bit E/NON da VB.NET a C#

curStyle = curStyle And (Not ES_NUMBER) 

codice modificato (C#):

curStyle = curStyle & (!ES_NUMBER); 

Ma mi sta dando questo errore:

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

ES_NUMBER è di tipo dati lungo. Ho provato a cambiarlo in int, string, ecc. Tutto non funziona.

Come posso risolvere questo problema?

+0

Che tipo è curStyle? –

+0

Ottieni Reflector. Ti mostrerà questa e molte altre traduzioni. –

+0

'~' è l'operatore del complemento bit per bit, che converte ogni bit nell'operando. –

risposta

8

And corrisponde a &; hai capito bene Not di fronte a un Long è un operatore NOT bit a bit. L'equivalente C# è ~.

Il codice C# sarebbe:

curStyle = curStyle & (­~ES_NUMBER); 

Partenza Bitwise operators in c# OR(|), XOR(^), AND(&), NOT(~), spiegando C# operatori bit a bit.

+0

Sì, funziona! Sìì!! Grazie mille, amico! :) –

+0

Si potrebbe anche scrivere 'curStyle & = ~ ES_NUMBER;'. –

0

Una singola e commerciale è in genere un'operazione bit-saggia, ma l'esclamazione è un'operazione logica. È necessario utilizzare two ampersands alla C++ se si vuole una logica AND:

curStyle = curStyle && (!ES_NUMBER); 

O una tilde, se si desidera un po 'saggio E:

curStyle = curStyle & (~ES_NUMBER); 
+0

Una singola e commerciale non è sempre un po 'saggia e. Considera (vero e falso) che è logico e. –

+0

L'OP sta * cercando * di eseguire una manipolazione bit-wise! – Gabe

+0

@Gabe: Sì, ho semplicemente cercato le parole chiave 'And' e' Not' in VB. Interessante che lavorano implicitamente. –

2

Ancora una volta, un viaggio alla documentazione dimostra didattico:

From MSDN:

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

Non c'è nulla nella documentazione in nessuna parte su qualsiasi comportamento per le espressioni numeriche, che mi aspetterei significhi che l'operatore non è definito per funzionare con quelle espressioni affatto.

D'altra parte, 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...

Quindi la domanda è ora: come riprodurre il comportamento di VB.NET del "non" per C#? Per fortuna, non è difficile: puoi usare lo ~ operator.

curStyle = curStyle & (­~ES_NUMBER); 

E, per buona misura, il documentation on &:

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

0

La domanda chiave è (e la risposta a cui è non fornito): E 'curStyle un intero o un bool? Stai cercando di ottenere un valore di verità (bool, vero/falso) o stai cercando di mascherare i bit in un campo di bit?

Per il caso ex, dove curStyle è un bool (valore di verità), si dicono:

curStyle = curStyle && !ES_NUMBER ; 

Quest'ultimo caso, in cui curStyle è un tipo intero e si vuole manipolare le sue punte, prende:

curStyle = curStyle & ~Not ES_NUMBER ; 
+0

ES_NUMBER è un lungo. Pertanto (non ES_NUMBER) è lungo. Il che a sua volta significa che curStyle deve essere lungo se si utilizza un controllo di tipo rigoroso. –