2016-01-31 62 views
2

左移(-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 
+0

这取决于你所说的“更好” –

+0

清洁,更高效的意思。 '1 << 3'会膨胀,但这是不可能的。 – mcu

+2

我会说最简洁的方法是升级PowerShell。所有支持的Windows版本至少可以运行PowerShell v3。 –

回答

2

可惜你不能在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 
+0

这会失败,像'bitshift 0xFFFF -right 1'这样的参数。它返回32767.5而不是32767.将返回值转换为[int]将解决该问题。如果OP想用64位数字,如果右移53或更多,将会发生精度损失。这种方法很难修正,因为[math] :: pow只接受具有52位精度的[double]参数。 –

+0

@ user2460798良好的捕获,更新的答案样本(我已经发布了它,相反,任何十进制值都是应该已经移开的位) –

+0

如果数字为负数,地板将不起作用:'bitshift -1 - 右-1'给出-1。结果朝向负无穷大,而转换为[int]趋向于零 –

0

我偶然发现了同样的问题,我想包括一些有用的信息:

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