rhe*_*one 5 c# hex biginteger ones-complement
我遇到了一个问题,因为我有一个隐含的无符号十六进制数作为字符串,由用户输入提供,需要转换为BigInteger.
由于BigInteger设置了最高阶位 (0x8 / 1000b) 的任何输入的有符号性质,结果数字被视为负数。然而,这个问题不能通过简单地检查符号位并乘以 -1 或由于不尊重基础符号的补码获得绝对值来解决,例如将所有值 0xF* 视为 -1。
以下是一些示例输入/输出
var style = NumberStyles.HexNumber | NumberStyles.AllowHexSpecifier;
BigInteger.TryParse("6", style) == 6 // 0110 bin
BigInteger.TryParse("8", style) == -8 // 1000 bin
BigInteger.TryParse("9", style) == -7 // 1001 bin
BigInteger.TryParse("A", style) == -6 // 1010 bin
...
BigInteger.TryParse("F", style) == -1 // 1111 bin
...
BigInteger.TryParse("FA", style) == -6 // 1111 1010 bin
BigInteger.TryParse("FF", style) == -1 // 1111 1111 bin
...
BigInteger.TryParse("FFFF", style) == -1 // 1111 1111 1111 1111 bin
Run Code Online (Sandbox Code Playgroud)
BigInteger从隐含的无符号十六进制字符串构造 a 的正确方法是什么?
在十六进制字符串前面加上“0”前缀就可以了:
BigInteger.TryParse(string.Format("0{0}", "FFFF"), style, ...)
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我的 BigInteger 是 65535。
编辑
BigInteger文档摘录:
解析十六进制字符串时,BigInteger.Parse(String, NumberStyles) 和 BigInteger.Parse(String, NumberStyles, IFormatProvider) 方法假定是否设置了字符串中第一个字节的最高有效位,或者如果第一个十六进制数字字符串的 表示字节值的低四位,该值使用二进制补码表示法来表示。例如,“FF01”和“F01”都表示十进制值-255。为了区分正值和负值,正值应包含前导零。ToString方法的相关重载,当它们传递“X”格式字符串时,在返回的十六进制字符串中添加前导零以表示正值。