Добавление компилятором побитового И в дерево выражений с операцией сдвига битов - PullRequest
0 голосов
/ 05 февраля 2019

Я ожидаю, что следующий код:

Dim i = 7, j = 5
Dim expr As Expression(Of Func(Of Integer)) = Function() i << j

создаст дерево выражений LambdaExpression с одной операцией между двумя переменными i и j.Вместо этого дерево выражений содержит дополнительную побитовую & операцию против 31, как можно увидеть в следующем DebugView:

.Lambda #Lambda1<System.Func`1[System.Int32]>() {
    .Constant<_visualizerTests.VB.Module1+_Closure$__0-0>(_visualizerTests.VB.Module1+_Closure$__0-0).$VB$Local_i << (.Constant<_visualizerTests.VB.Module1+_Closure$__0-0>(_visualizerTests.VB.Module1+_Closure$__0-0).$VB$Local_j &
    31)
}

или визуально :

Expression Tree Visualizer screenshot

Та же операция вводится, когда используется сдвиг вправо.

Компилятор C #, похоже, не имеет такого же поведения - ни сдвиг влево, ни вправооператоры -shift заставляют компилятор вводить какие-либо дополнительные операции.

Почему эта дополнительная операция введена?

1 Ответ

0 голосов
/ 12 февраля 2019

Из документов :

Чтобы предотвратить сдвиг на большее количество битов, чем может удержать результат, Visual Basic маскирует значение amount с помощью маски размера, соответствующейк типу данных pattern.Двоичный код AND этих значений используется для величины сдвига.

...