打开Short的最左边的位

时间:2010-07-08 00:35:11

标签: vb.net bit-manipulation bitwise-operators negation negate

原始问题已更改。

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

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

对于按位运算符,有没有更短的方法?

当我这样做时

Dim a = Short.MaxValue Or &H8000

我收到编译错误,因为它上升了,而不是否定它。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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