Domanda

domanda originale ha cambiato.

Voglio bit a bit Spegnere il bit più a sinistra di un valore breve (e H8000) e lasciare gli altri bit come sono.

Dim x = BitConverter.GetBytes(Short.MaxValue Or &H8000)
Dim z = BitConverter.ToInt16(x, 0)

Non c'è alcun modo più breve con operatori bit per bit?

Quando faccio

Dim a = Short.MaxValue Or &H8000

ottengo un errore di compilazione, perchè va in su, invece di negarla.

È stato utile?

Soluzione

Questo perché .NET utilizza complemento a due, non firmato grandezza. Di negare, bisogna capovolgere tutti i bit e quindi aggiungere uno.

è sufficiente utilizzare il meno unario. Si prega di ... Abbastanza per favore.

EDIT: Se per qualche strana ragione si doveva fare questo con le operazioni bit per bit, si dovrebbe fare questo:

Dim somewhatCorrect = (Short.MaxValue xor Short.MinValue) + 1;

che naturalmente non è ancora bit a bit, perché la negazione complemento a due non può essere fatto in modo efficiente con operatori bit a bit.

EDIT2: Ed ecco un meno unario:

Dim correct = -Short.MaxValue;

Edit3: In risposta alla domanda modificato :

Dim x As Short = 42
Dim xWithHighBitOn = x Or Short.MinValue

Altri suggerimenti

complemento a due

Dim testV As Short = &HD555S 'a test value

Dim twosC As Short 'twos comp

twosC = (testV Xor &HFFFFS) + 1S 'reverse the bits, add 1

Cambia bit più significativo

twosC = twosC Xor &H8000S
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top