左移(-shl
)和右移(-shr
)运算符仅在PowerShell 3.0及更高版本中可用。PowerShell 2.0中的位移
我该如何转移PowerShell 2.0?
这是我到目前为止。有没有更好的办法?
>>>$x = 1
>>>$shift = 3
>>>$x * [math]::pow(2, $shift)
8
>>>$x = 32
>>>$shift = -3
>>>$x * [math]::pow(2, $shift)
4
左移(-shl
)和右移(-shr
)运算符仅在PowerShell 3.0及更高版本中可用。PowerShell 2.0中的位移
我该如何转移PowerShell 2.0?
这是我到目前为止。有没有更好的办法?
>>>$x = 1
>>>$shift = 3
>>>$x * [math]::pow(2, $shift)
8
>>>$x = 32
>>>$shift = -3
>>>$x * [math]::pow(2, $shift)
4
可惜你不能在PowerShell中(据我所知)实施新的运营商,但你可以换一个函数内部操作:
function bitshift {
param(
[Parameter(Mandatory,Position=0)]
[int]$x,
[Parameter(ParameterSetName='Left')]
[ValidateRange(0,[int]::MaxValue)]
[int]$Left,
[Parameter(ParameterSetName='Right')]
[ValidateRange(0,[int]::MaxValue)]
[int]$Right
)
$shift = if($PSCmdlet.ParameterSetName -eq 'Left')
{
$Left
}
else
{
-$Right
}
return [math]::Floor($x * [math]::Pow(2,$shift))
}
,使得使用多一点的可读性:
PS> bitshift 32 -right 3
4
PS> bitshift 1 -left 3
8
这会失败,像'bitshift 0xFFFF -right 1'这样的参数。它返回32767.5而不是32767.将返回值转换为[int]将解决该问题。如果OP想用64位数字,如果右移53或更多,将会发生精度损失。这种方法很难修正,因为[math] :: pow只接受具有52位精度的[double]参数。 –
@ user2460798良好的捕获,更新的答案样本(我已经发布了它,相反,任何十进制值都是应该已经移开的位) –
如果数字为负数,地板将不起作用:'bitshift -1 - 右-1'给出-1。结果朝向负无穷大,而转换为[int]趋向于零 –
我偶然发现了同样的问题,我想包括一些有用的信息:
PoSh2.0-BitShifting创建一个$Global:Bitwise
对象,该对象提供大部分按位操作。使用(从自己的自述)的
例子:
PS C:\> Enable-BitShift
PS C:\> $Bitwise
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PoShBitwiseBuilder System.Object
PS C:\> $Bitwise::Lsh(32,2)
128
PS C:\> $Bitwise::Rsh(128,2)
32
这取决于你所说的“更好” –
清洁,更高效的意思。 '1 << 3'会膨胀,但这是不可能的。 – mcu
我会说最简洁的方法是升级PowerShell。所有支持的Windows版本至少可以运行PowerShell v3。 –