Vb.net 打开最左边的一个短路位

Vb.net 打开最左边的一个短路位,vb.net,bit-manipulation,bitwise-operators,negation,negate,Vb.net,Bit Manipulation,Bitwise Operators,Negation,Negate,原始问题已更改。 我希望按位关闭短值(&H8000)的最左边的位,并保持其他位不变 Dim x = BitConverter.GetBytes(Short.MaxValue Or &H8000) Dim z = BitConverter.ToInt16(x, 0) 有没有比按位运算符更短的方法 当我这样做的时候 Dim a = Short.MaxValue Or &H8000 我得到一个编译器错误,因为它上升了,而不是否定它。这是因为.NET使用2的补码,而不是有符号的大小。

原始问题已更改。

我希望按位关闭短值(&H8000)的最左边的位,并保持其他位不变

Dim x = BitConverter.GetBytes(Short.MaxValue Or &H8000)
Dim z = BitConverter.ToInt16(x, 0)
有没有比按位运算符更短的方法

当我这样做的时候

Dim a = Short.MaxValue Or &H8000

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

这是因为.NET使用2的补码,而不是有符号的大小。要求反,必须翻转所有位,然后添加一位

请使用一元负号。求你了…求你了

编辑:如果出于某种奇怪的原因,必须使用位操作执行此操作,则必须执行以下操作:

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

这是因为.NET使用2的补码,而不是符号大小。要求反,必须翻转所有位,然后添加一位

请使用一元负号。求你了…求你了

编辑:如果出于某种奇怪的原因,必须使用位操作执行此操作,则必须执行以下操作:

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
二元补码

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

那么,有没有一种方法可以通过操作员来实现呢?我只是想让上面的解释变得不那么严格,既然我不是大比特人,我怎么能满足你的要求呢operator@Shimmy:否。不能使用
XOR
对数字求反。你必须对数字进行位反转,然后再加一求反。@Shimmy:我是说不要用位运算符进行此操作。y,因为这样会有更多的运算并转换为int?我只是想知道,有没有办法和接线员联系?我只是想让上面的解释变得不那么严格,既然我不是大比特人,我怎么能满足你的要求呢operator@Shimmy:否。不能使用
XOR
对数字求反。你必须对数字进行位反转,然后再加一求反。@Shimmy:我是说不要用位运算符进行此操作。y,因为这样会有更多的运算并转换为int?我只是想知道