Операторы вправо и влево в Classi c ASP - PullRequest
1 голос
/ 16 апреля 2020

Как использовать оператор Right Shift в классе c ASP. Как предложено в В ASP, Сдвиг битового оператора и Сдвиг вправо , я использовал "\" для оператора правого сдвига. это дает мне неверный результат.

Например, в javascript, 33555758 >> 24 дает результат 2. Но в Classi c ASP 33555758 \ 24 дает результат деления.

Пожалуйста помоги мне в этом.

1 Ответ

1 голос
/ 21 апреля 2020

Побитовый сдвиг вправо >> не равен простому делению \ на заданное число, а на заданное число раз на целое число 2, которое является двоичным 10. Сдвиг бит сдвигает каждый ди git в набор битов правильно. Т.е. деление на двоичное число 10 удаляет двоичное число di git из числа и сдвигает цифры вправо.

Пример: 5 >> 1 = 2

5       00000000000000000000000000000101 
5 >> 1  00000000000000000000000000000010 (2)

, что соответствует 5/2,

, т.е. в вашем случае это будет не 33555758 \ 24, а 24 деление на времена 2. Поскольку в vbscript нет прямого метода, его можно сделать как

Function SignedRightShift(pValue, pShift)

Dim NewValue, PrevValue, i
PrevValue = pValue
For i = 1 to pShift
    Select Case VarType(pValue)
        Case vbLong
            NewValue = Int((PrevValue And "&H7FFFFFFF") / 2)
            If PrevValue And "&H80000000" Then NewValue = NewValue Or "&HC0000000"
            NewValue = CLng(NewValue)
        Case vbInteger
            NewValue = Int((PrevValue And "&H7FFF") / 2)
            If PrevValue And "&H8000" Then NewValue = NewValue Or "&HC000"
            NewValue = CInt("&H"+ Hex(NewValue))
        Case vbByte
            NewValue = Int(PrevValue / 2)
            If PrevValue And "&H80" Then NewValue = NewValue Or "&HC0"
            NewValue = CByte(NewValue)
        Case Else: Err.Raise 13 ' Not a supported type
    End Select
    PrevValue = NewValue
Next
SignedRightShift = PrevValue

End Function

и использовать как

x = SignedRightShift(33555758, 24)

Подробнее см. http://chris.wastedhalo.com/2014/05/more-binarybitwise-functions-for-vbscript/

...