Включите самый левый бит короткого замыкания - PullRequest
0 голосов
/ 08 июля 2010

Исходный вопрос изменен.

Я хочу поразрядно отключить самый левый бит значения Short (& H8000) и оставить остальные биты такими, какие они есть.

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

Нет ли более короткого пути с побитовыми операторами?

Когда я делаю

Dim a = Short.MaxValue Or &H8000

Я получаю ошибку компилятора, потому что она идет вверх, вместо того, чтобы отрицать ее.

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

Это потому, что .NET использует два дополнения, а не знаковое значение. Чтобы отрицать, вы должны перевернуть все биты, а затем добавить один.

Пожалуйста, просто используйте унарный минус. Пожалуйста ... Довольно пожалуйста.

РЕДАКТИРОВАТЬ: Если по какой-то странной причине вам пришлось делать это с побитовыми операциями, вы должны сделать это:

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

что, конечно, все еще не является побитовым, потому что отрицание дополнения до двух не может быть эффективно сделано с побитовыми операторами.

EDIT2: А вот унарный минус:

Dim correct = -Short.MaxValue;

РЕДАКТИРОВАТЬ3: В ответ на отредактированный вопрос :

Dim x As Short = 42
Dim xWithHighBitOn = x Or Short.MinValue
1 голос
/ 08 июля 2010

Два дополнения

Dim testV As Short = &HD555S 'a test value

Dim twosC As Short 'twos comp

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

Изменение старшего значащего бита

twosC = twosC Xor &H8000S
...