编译器通过移位操作将“与”运算与表达式树相加

时间:2019-02-04 23:56:34

标签: .net vb.net expression-trees

我期望下面的代码:

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

生成LambdaExpression的表达式树,并在两个变量ij之间进行单个操作。相反,表达式树包含针对&的附加按位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)
}

visually

Expression Tree Visualizer screenshot

使用右移时会引入相同的操作。

C#编译器似乎没有相同的行为-左移和右移运算符都不会导致编译器引入任何其他操作。

为什么要引入此附加操作?

1 个答案:

答案 0 :(得分:2)

来自docs

  

为防止移位超出结果可容纳的位数,Visual Basic使用与amount的数据类型相对应的大小掩码来屏蔽pattern的值。这些值的二进制AND用于偏移量。