何时在C#中使用Shift运算符<>?

我正在研究C#中的移位运算符,试图找出何时在我的代码中使用它们。

我找到了答案,但对于Java,你可以:

a)进行更快的整数乘法和除法运算:

* 4839534 * 4 *可以这样做: 4839534 << 2

要么

543894/2可以这样做: 543894 >> 1

对于大多数处理器,移位操作比乘法更快。

b)将字节流重组为int值

c)用于加速图形操作,因为红色,绿色和蓝色由单独的字节编码。

d)将小数字装入一个长的…


对于b,c和d,我无法在这里想象一个真实的样本。

有谁知道我们是否可以在C#中完成所有这些项目? C#中的移位运算符是否有更实际的用途?

没有必要将它们用于优化目的,因为编译器会为您处理这个问题。

只有在移位时使用它们才是代码的真正意图(如问题中的其余示例)。 剩下的时间只是使用乘法和除法,所以你的代码的读者可以一目了然地理解它。

除非有一个非常令人信服的理由,否则我认为使用这样的聪明技巧通常只会使代码更加混乱而附加值很少。 编译器编写者是一群聪明的开发人员,他们比普通程序员更了解这些技巧。 例如,使用移位运算符将除以2的幂除以整数比使用除法更快,但它可能不是必需的,因为编译器会为您执行此操作。 您可以通过查看Microsoft C / C ++编译器和gcc执行这些优化的程序集来看到这一点。

我将分享一个我曾经偶然发现的有趣用法。 这个例子是无耻地从补充答案复制到问题,“ [标志]枚举属性在C#中意味着什么? ”

[Flags] public enum MyEnum { None = 0, First = 1 << 0, Second = 1 << 1, Third = 1 << 2, Fourth = 1 << 3 } 

这比写入文字1, 2, 4, 8, ...值更容易扩展,特别是一旦你超过17个标志。

权衡是,如果你需要超过31个标志( 1 << 30 ),你还需要注意将你的枚举指定为具有比有符号整数更高的上限(通过将其声明为public enum MyEnum : ulong ,例如,它将为您提供多达64个标志)。 这是因为...

 1 << 29 == 536870912 1 << 30 == 1073741824 1 << 31 == -2147483648 1 << 32 == 1 1 << 33 == 2 

相反,如果将枚举值直接设置为2147483648,编译器将抛出错误。

正如ClickRick所指出的,即使你的枚举来自ulong,你的位移操作也必须针对ulong执行,否则你的枚举值仍然会被破坏。

 [Flags] public enum MyEnum : ulong { None = 0, First = 1 << 0, Second = 1 << 1, Third = 1 << 2, Fourth = 1 << 3, // Compiler error: // Constant value '-2147483648' cannot be converted to a 'ulong' // (Note this wouldn't be thrown if MyEnum derived from long) ThirtySecond = 1 << 31, // so what you would have to do instead is... ThirtySecond = 1UL << 31, ThirtyThird = 1UL << 32, ThirtyFourth = 1UL << 33 } 

查看这些维基百科有关二进制数系统和算术移位的文章 。 我想他们会回答你的问题。

如今,业务应用程序中很少遇到class次运营商。 它们经常出现在与硬件交互或操纵打包数据的低级代码中。 在64k内存段的时代,它们更常见。