Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时使用轮班操作员<<&燃气轮机&燃气轮机;在C#中?_C#_Operators_Bit Shift - Fatal编程技术网

何时使用轮班操作员<<&燃气轮机&燃气轮机;在C#中?

何时使用轮班操作员<<&燃气轮机&燃气轮机;在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#中的移位运算符是否有更实际的用途?

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

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

a) 使更快整数乘除运算:

*4839534*4*可以这样做: 4839534>1

对于大多数处理器来说,移位运算比乘法运算快得多

b) 将字节流重新组装为int值

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

d) 将小数字打包成一个长


对于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
}