何时使用轮班操作员<<&燃气轮机&燃气轮机;在C#中?
我在研究C#中的移位运算符,试图找出答案 何时在我的代码中使用它们 我找到了答案,但对于Java,您可以: a) 使更快整数乘除运算: *4839534*4*可以这样做: 4839534>1 对于大多数处理器来说,移位运算比乘法运算快得多 b) 将字节流重新组装为int值 c) 用于加速图形操作,因为红色、绿色和蓝色由单独的字节编码 d) 将小数字打包成一个长何时使用轮班操作员<<&燃气轮机&燃气轮机;在C#中?,c#,operators,bit-shift,C#,Operators,Bit Shift,我在研究C#中的移位运算符,试图找出答案 何时在我的代码中使用它们 我找到了答案,但对于Java,您可以: a) 使更快整数乘除运算: *4839534*4*可以这样做: 4839534>1 对于大多数处理器来说,移位运算比乘法运算快得多 b) 将字节流重新组装为int值 c) 用于加速图形操作,因为红色、绿色和蓝色由单独的字节编码 d) 将小数字打包成一个长 对于b、c和d,我无法想象这里有一个真正的样本 有人知道我们是否能用C语言完成所有这些项目吗? C#中的移位运算符是否有更实际的用途?
对于b、c和d,我无法想象这里有一个真正的样本 有人知道我们是否能用C语言完成所有这些项目吗?
C#中的移位运算符是否有更实际的用途?请查看这些关于和的维基百科文章。我想他们会回答你的问题
如今,在商业应用中很少遇到轮班操作员。它们经常出现在与硬件交互或处理压缩数据的低级代码中。在64k内存段的时代,它们更为常见。没有必要将它们用于优化目的,因为编译器将为您解决这一问题
仅当移位位是代码的真正意图时才使用它们(如问题中的其余示例所示)。其余时间只需使用乘法和除法,这样代码的读者就可以一目了然。除非有非常令人信服的理由,否则我的观点是,使用这样的巧妙技巧通常只会使代码更加混乱,附加值很小。编译器编写者是一群聪明的开发人员,他们比普通程序员懂得更多的技巧。例如,使用shift运算符将整数除以2的幂比使用除法更快,但这可能不是必需的,因为编译器将为您执行此操作。通过查看Microsoft C/C++编译器和gcc都执行这些优化的程序集,您可以看到这一点。我将分享我在过去偶然发现的一个有趣的用法。这个例子无耻地抄袭了对这个问题的补充回答 相反,如果将枚举值直接设置为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
}
[标志]
公共枚举MyEnum:ulong
{
无=0,
First=1“进行更快的整数乘除运算。”不要这样做。现代编译器会帮你做的。这只会让你的代码更难阅读。在20世纪80年代,在一些优化不好的C编译器中,这种转换比乘法更快。这是一个城市传说,它仍然会带来不同。压缩数据仍然很常见,但C程序员应该使用位转换器(不是BinaryReader)或用于开发的位向量。只有当该代码被验证为性能问题时,您才会返回并使用显式位操作运算符重写。“非常常见”是一个相对术语。我上一次使用压缩数据是在1992年,当时我必须将8000颗恒星的坐标拟合到一个数据段中。如果超过int.MaxValue
,则需要将值显式指定为long,或者指定为将计算为long的值,例如E32=1L
1 << 29 == 536870912
1 << 30 == 1073741824
1 << 31 == -2147483648
1 << 32 == 1
1 << 33 == 2
[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
}