0

原来的问题变了。

我想按位关闭 Short 值 (&H8000) 的最左边的位,并保留其他位。

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

按位运算符没有更短的方法吗?

当我做

Dim a = Short.MaxValue Or &H8000

我得到一个编译器错误,因为它上升了,而不是否定它。

4

2 回答 2

3

那是因为 .NET 使用二进制补码,而不是有符号的幅度。要否定,您必须翻转所有位,然后添加一个。

只使用一元减号。拜托……拜托了。

编辑:如果出于某种奇怪的原因您必须使用按位运算来执行此操作,则必须这样做:

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

这当然仍然不是按位的,因为二进制补码否定不能用按位运算符有效地完成。

EDIT2:这是一个一元减号:

Dim correct = -Short.MaxValue;

EDIT3:针对已编辑的问题

Dim x As Short = 42
Dim xWithHighBitOn = x Or Short.MinValue
于 2010-07-08T00:37:25.200 回答
1

二进制补码

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
于 2010-07-08T12:35:20.307 回答