【问题标题】:Turn on leftmost bit of a Short开启 Short 的最左边位
【发布时间】:2011-03-13 02:39:50
【问题描述】:

原问题已更改。

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

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

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

当我这样做时

Dim a = Short.MaxValue Or &H8000

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

【问题讨论】:

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


    【解决方案1】:

    这是因为 .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
    

    【讨论】:

    • 那么,有没有办法通过操作员来做到这一点?我只是想让上述内容不那么健壮
    • 请解释我如何执行您的操作,因为我不是大位运算符
    • @Shimmy:不。你不能使用ORXOR 来否定一个数字。您必须按位反转该数字,然后加一以取反。
    • @Shimmy:我是说不要用位运算符来做这个
    • y, cuz 那么它会更多的操作并转换为 int 吗?我只想知道
    【解决方案2】:

    补码

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多