Jun*_*r M 29 c# operators bit-shift
我正在研究C#中的移位运算符,试图找出何时在我的代码中使用它们.
我找到了答案,但对于Java,你可以:
a)进行更快的整数乘法和除法运算:
*4839534*4*可以这样做: 4839534 << 2
要么
543894/2可以这样做:543894 >> 1
对于大多数处理器,移位操作比乘法更快.
b)将字节流重组为int值
c)用于加速图形操作,因为红色,绿色和蓝色由单独的字节编码.
d)将小数字装入一个长的...
对于b,c和d,我无法想象这里是一个真实的样本.
有谁知道我们是否可以在C#中完成所有这些项目?C#中的移位运算符是否有更实用的用途?
Gra*_*meF 38
没有必要将它们用于优化目的,因为编译器会为您处理这个问题.
只有在移位时使用它们才是代码的真正意图(如问题中的其余示例).剩下的时间只是使用乘法和除法,所以你的代码的读者可以一目了然地理解它.
Mar*_*ins 17
除非有一个非常令人信服的理由,否则我认为使用这样的聪明技巧通常会使代码更加混乱而附加值很少.编译器编写者是一群聪明的开发人员,他们比普通程序员更了解这些技巧.例如,使用移位运算符将除以2的幂除以整数比使用除法更快,但可能没有必要,因为编译器会为您执行此操作.您可以通过查看Microsoft C/C++编译器和gcc执行这些优化的程序集来查看此内容.
aaa*_*ine 15
我会分享一个我曾经偶然发现的有趣用法.这个例子是无耻地从补充答案复制到问题," [标志]枚举属性在C#中意味着什么? "
[Flags]
public enum MyEnum
{
None = 0,
First = 1 << 0,
Second = 1 << 1,
Third = 1 << 2,
Fourth = 1 << 3
}
Run Code Online (Sandbox Code Playgroud)
这比编写文字1, 2, 4, 8, ...值更容易扩展,特别是一旦你超过17个标志.
权衡是,如果你需要超过31个flags(1 << 30),你还需要注意将你的枚举指定为具有比有符号整数更高的上限的东西(public enum MyEnum : ulong例如,通过将其声明为,这将使你达到64旗).这是因为...
1 << 29 == 536870912
1 << 30 == 1073741824
1 << 31 == -2147483648
1 << 32 == 1
1 << 33 == 2
Run Code Online (Sandbox Code Playgroud)
相反,如果将枚举值直接设置为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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19956 次 |
| 最近记录: |