为什么此 PowerShell 位操作产生的输出与 Python 不同?
Why is this PowerShell bit manipulation producing different output than Python?
我在 Python 和 PowerShell 中有一个脚本打算做同样的事情。当我执行 "not" 操作符,然后在两个脚本中执行 -1 % 256
操作时,我得到不同的输出:
PowerShell
-bnot 0: -1
(-1 % 256): -1
Python
(~0): -1
(-1 % 256): 255
并且,在不同的系统上,我再次从 PowerShell 获得不同的输出:
PowerShell
-bnot 0: 18446744073709551615
18446744073709551615 % 256: 255
Python
-bnot 0: -1
(-1 % 256): 255
如何让我的 PowerShell -bnot
和 %
运算符每次都产生与 Python 脚本相同的输出? PowerShell 版本相同。
事实证明,正确答案是 PowerShell 不像其他语言那样处理带负数的模数。
How to get PowerShell to perform modulus on negative numbers correctly.
第一个示例的解释是,在 PowerShell 中(与 .NET 上的大多数其他语言实现一样)%
是一个 remainder 运算符,而不是 模数 运算符。埃里克·利珀特 explains the difference in this article.
在第二个示例中,您似乎将二元 NOT 运算符应用于无符号 64 位整数。一个无符号整数显然不能为负,所以你看到的是应用 NOT to 0x0
:
的整数表示
PS C:\> -bnot [int]0
-1
PS C:\> -bnot [uint64]0
18446744073709551615
PS C:\> ([int]0).ToString('X2').PadLeft(8,'0')
00000000
PS C:\> ([int]-1).ToString('X2').PadLeft(8,'0')
FFFFFFFF
PS C:\> ([uint64]0).ToString('X2').PadLeft(16,'0')
0000000000000000
PS C:\> ([uint64]18446744073709551615).ToString('X2').PadLeft(16,'0')
FFFFFFFFFFFFFFFF
对于模运算,可以加上除数直到被除数为greater-than-or-equal-to 0:
$i = -1
$d = 256
while($i -lt 0){
$i += $d
}
$i % 256
在大多数模运算的实际应用中,将除数相加一次就足够了:
$r = ($i + $d) % $d
我在 Python 和 PowerShell 中有一个脚本打算做同样的事情。当我执行 "not" 操作符,然后在两个脚本中执行 -1 % 256
操作时,我得到不同的输出:
PowerShell
-bnot 0: -1
(-1 % 256): -1
Python
(~0): -1
(-1 % 256): 255
并且,在不同的系统上,我再次从 PowerShell 获得不同的输出:
PowerShell
-bnot 0: 18446744073709551615
18446744073709551615 % 256: 255
Python
-bnot 0: -1
(-1 % 256): 255
如何让我的 PowerShell -bnot
和 %
运算符每次都产生与 Python 脚本相同的输出? PowerShell 版本相同。
事实证明,正确答案是 PowerShell 不像其他语言那样处理带负数的模数。
How to get PowerShell to perform modulus on negative numbers correctly.
第一个示例的解释是,在 PowerShell 中(与 .NET 上的大多数其他语言实现一样)%
是一个 remainder 运算符,而不是 模数 运算符。埃里克·利珀特 explains the difference in this article.
在第二个示例中,您似乎将二元 NOT 运算符应用于无符号 64 位整数。一个无符号整数显然不能为负,所以你看到的是应用 NOT to 0x0
:
PS C:\> -bnot [int]0
-1
PS C:\> -bnot [uint64]0
18446744073709551615
PS C:\> ([int]0).ToString('X2').PadLeft(8,'0')
00000000
PS C:\> ([int]-1).ToString('X2').PadLeft(8,'0')
FFFFFFFF
PS C:\> ([uint64]0).ToString('X2').PadLeft(16,'0')
0000000000000000
PS C:\> ([uint64]18446744073709551615).ToString('X2').PadLeft(16,'0')
FFFFFFFFFFFFFFFF
对于模运算,可以加上除数直到被除数为greater-than-or-equal-to 0:
$i = -1
$d = 256
while($i -lt 0){
$i += $d
}
$i % 256
在大多数模运算的实际应用中,将除数相加一次就足够了:
$r = ($i + $d) % $d