原来的问题变了。
我想按位关闭 Short 值 (&H8000) 的最左边的位,并保留其他位。
Dim x = BitConverter.GetBytes(Short.MaxValue Or &H8000)
Dim z = BitConverter.ToInt16(x, 0)
按位运算符没有更短的方法吗?
当我做
Dim a = Short.MaxValue Or &H8000
我得到一个编译器错误,因为它上升了,而不是否定它。
原来的问题变了。
我想按位关闭 Short 值 (&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;
这当然仍然不是按位的,因为二进制补码否定不能用按位运算符有效地完成。
EDIT2:这是一个一元减号:
Dim correct = -Short.MaxValue;
EDIT3:针对已编辑的问题:
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