Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这种PowerShell位操作产生的输出与Python不同?_Powershell_Bit Manipulation_Powershell 2.0_Bit_Twos Complement - Fatal编程技术网

为什么这种PowerShell位操作产生的输出与Python不同?

为什么这种PowerShell位操作产生的输出与Python不同?,powershell,bit-manipulation,powershell-2.0,bit,twos-complement,Powershell,Bit Manipulation,Powershell 2.0,Bit,Twos Complement,我有一个Python和PowerShell脚本,打算做同样的事情。当我在两个脚本中执行“not”操作符,然后执行-1%256操作时,我会得到不同的输出: PowerShell -bnot 0: -1 (-1 % 256): -1 -bnot 0: 18446744073709551615 18446744073709551615 % 256: 255 Python (~0): -1 (-1 % 256): 255 -bnot 0: -1 (-1 % 256): 255 而且,在不同的系

我有一个Python和PowerShell脚本,打算做同样的事情。当我在两个脚本中执行“not”操作符,然后执行
-1%256
操作时,我会得到不同的输出:

PowerShell

-bnot 0: -1
(-1 % 256): -1
-bnot 0:  18446744073709551615
18446744073709551615 % 256: 255
Python

(~0): -1
(-1 % 256): 255
-bnot 0: -1
(-1 % 256): 255
而且,在不同的系统上,我从PowerShell再次获得不同的输出:

PowerShell

-bnot 0: -1
(-1 % 256): -1
-bnot 0:  18446744073709551615
18446744073709551615 % 256: 255
Python

(~0): -1
(-1 % 256): 255
-bnot 0: -1
(-1 % 256): 255

如何让我的PowerShell
-bnot
%
操作符每次都产生与Python脚本相同的输出?PowerShell的版本是相同的。

事实证明,正确的答案是PowerShell不像在其他语言中那样处理带负数的模


事实证明,正确的答案是PowerShell不像在其他语言中那样处理带负数的模


第一个示例的解释是,在PowerShell中(与.NET上的大多数其他语言实现一样)
%
是一个余数运算符,而不是模运算符。埃里克·利珀特

在第二个示例中,您似乎将二进制NOT运算符应用于无符号64位整数。无符号整数显然不能为负,因此您看到的是正确的整数表示形式,即不应用于
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
对于模运算,可以添加除数,直到被除数大于或等于0:

$i = -1
$d = 256
while($i -lt 0){
    $i += $d
}
$i % 256
在模运算的大多数实际应用中,只需添加一次除数即可:

$r = ($i + $d) % $d

第一个示例的解释是,在PowerShell中(与.NET上的大多数其他语言实现一样)
%
是一个余数运算符,而不是模运算符。埃里克·利珀特

在第二个示例中,您似乎将二进制NOT运算符应用于无符号64位整数。无符号整数显然不能为负,因此您看到的是正确的整数表示形式,即不应用于
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
对于模运算,可以添加除数,直到被除数大于或等于0:

$i = -1
$d = 256
while($i -lt 0){
    $i += $d
}
$i % 256
在模运算的大多数实际应用中,只需添加一次除数即可:

$r = ($i + $d) % $d

是否显式强制数字的类型?在第二个示例中,您得到了一个无符号整数。您知道Python使用的是什么吗?我如何在PowerShell中实现这一点?我周围没有窗口,但我想像
-bnot[int]0
这样的东西应该可以。不,我认为这不起作用。实际上PowerShell v2.0或更高版本?什么操作系统,哪个PowerShell主机(控制台或ISE或其他?)什么Python版本?没有配置文件的PowerShell?这两个系统有什么不同?您实际上是在做如图所示的测试,还是在使用变量?如果是这样,PowerShell中的
$x.GetType()
和Python中的
type(x)
是什么?显式强制数字的类型?在第二个示例中,您得到了一个无符号整数。您知道Python使用的是什么吗?我如何在PowerShell中实现这一点?我周围没有窗口,但我想像
-bnot[int]0
这样的东西应该可以。不,我认为这不起作用。实际上PowerShell v2.0或更高版本?什么操作系统,哪个PowerShell主机(控制台或ISE或其他?)什么Python版本?没有配置文件的PowerShell?这两个系统有什么不同?您实际上是在做如图所示的测试,还是在使用变量?如果是这样,PowerShell中的
$x.GetType()
和Python中的
type(x)
是什么?