最近我在 虽然 F# 中的其他整数类型允许执行位求反System.Numerics.BigInteger
中发现了一个奇怪的现象。 type definition似乎缺乏理由 - 这种类型 does not support按位NOT
运算符(F# 中的 ~~~
)。以及 .NET 生态系统中的整体,但 bigint
类型缺少通讯员 ~~~
运算符。
事实上bigint
是底层硬件不直接支持的合成类型并不妨碍它支持其他按位运算符,即 <<<
, >>>
, |||
, ^^^
,和&&&
适应缺乏预设位宽度的情况。那么为什么~~~
不能吗?
编辑:感谢Jeppe Stig Nielsen感谢指出我对 System.Numerics.BigInteger
的疏忽类型有 OnesComplement
运算符(operator)准确执行 bitwise NOT
, 的确。我已相应地纠正了原来的问题。这让我相信~~~
bigint
中被省略无意中使用了 F# 中的运算符。
最佳答案
我不知道这一定是原因,但是缺乏固定宽度意味着~~~
不会满足它通常满足的一些良好特性。例如,应该~~~ 5I
是?从逻辑上讲,这应该是 0x1111...1010
(带有无限的前缀)。显然我们需要在某个地方修剪这个前缀。如果我们保持结果与输入的位宽相同,那么我们会得到 010 = 2
作为结果。但由于前导零并不重要,因此相同的逻辑表明 ~~~ 2I
应该是1I
。但后来~~~ (~~~ 5I) <> 5I
.
关于.net - 为什么 F# 中 bigint 缺少按位非运算符 (~~~)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16286160/