Вопрос

Оригинальный вопрос изменился.

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

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

Разве нет ничего более короткого пути с битовой операторами?

Когда я делаю

Dim a = Short.MaxValue Or &H8000

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

Это было полезно?

Решение

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

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

Редактировать: Если для некоторой странной причины вы должны были сделать это с побитовыми операциями, вам придется сделать это:

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

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

Редактировать2: А вот одинарный минус:

Dim correct = -Short.MaxValue;

Редактировать3: В ответ на отредактированный вопрос:

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

Другие советы

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top