何时是移位运算符>>或<<有用?

时间:2011-05-03 22:09:57

标签: c# .net shift bit-shift

  

可能重复:
  When to use Shift operators << >> in C# ?

我编程了一段时间,我从未使用过移位运算符。我可以看到它如何在计算Tuple<T>中的哈希码时有所帮助,但除此之外,

移位运算符何时以及如何在C#/ .NET中有用?

7 个答案:

答案 0 :(得分:13)

一般来说,它并不经常使用。但是在处理位级操作时它非常有用。例如,打印出数值

中的位
public static string GetBits(int value) {
  var builder = new StringBuilder();
  for (int i = 0; i < 32; i++) {
    var test = 1 << (31 - i);    
    var isSet = 0 != (test & value);
    builder.Append(isSet ? '1' : '0');
  }
  return builder.ToString();
}

答案 1 :(得分:10)

写两个权力是有用的。

快速:什么是2 27
答案:1 << 27

写作1 << 27134217728更容易,也更容易理解。

答案 2 :(得分:3)

我在处理硬件时使用了相当多的东西。这可能不是你在C#中做的很多,但是运算符是从C / C ++继承而来的,这是一个相当常见的需求。

示例1:

我刚刚从一个小端机器获得了一个长字,但我是一个大端。我该如何转换它?好吧,显而易见的是致电htonl()(你是骗子)。其中一种手动方式是使用以下内容:

        ((source & 0x000000ff) << 24 ) |
        ((source & 0x0000ff00) << 8) |
        ((source & 0x00ff0000) >> 8) |
        ((source & 0xff000000) >> 24);

示例2:

我有一个DMA设备,只允许高达512K的长字访问。因此,它需要将(仅由硬件人员理解的原因)将传输大小的模4放入DMA传输控制寄存器的高18位。为了争论,低位比特将填充控制DMA操作的各种标志。这样就可以完成:

dma_flags | ((length & 0xffffc) << 14);

这些可能不是每天所做的事情。但对于我们这些经常与硬件接口的人来说。

答案 3 :(得分:2)

如果您需要在不使用* How to implement multiplication without using multiplication operator in .NET的情况下相乘:)

或者写一个数独求解器Sudoku validity check algorithm - how does this code works?

在实践中,我唯一一次在我的(有限的)体验中看到它是一种(可以说)混淆的方式(参见第一个链接)或者与设置BitFlags(上面的数独求解器)相结合。

在.NET中,我很少需要在位级工作;但如果你需要,能够转移是很重要的。

答案 4 :(得分:2)

按位运算符有利于节省空间,但如今,空间几乎不是问题。

乘以2的幂

时很有用
number<<power;

number*2^power

当然按2的权力划分:

number>>power;

另一个地方是枚举中的标志。

当您遇到像

这样的代码时
Regex re = new Regex(".",RegexOptions.Multiline|RegexOptions.Singleline);

使用RegexOptions.Multiline|RegexOptions.Singleline的能力,即通过移位启用了多个标志,这也使它们成为唯一的。

类似的东西:

enum RegexOptions {
  Multiline  = (1 << 0), 
  Singleline = (1<<1)
};

答案 5 :(得分:0)

当需要操作各个位时使用位移。例如,您会在许多加密算法中看到很多位移。

在优化中,它可以代替乘法/除法。向左移动等于乘以2。右移等于分裂。您可能不再看到这样做,因为这种优化级别通常是不必要的。

除此之外,我想不出有很多理由使用它。我以前看过它,但很少在真正需要它的情况下使用,通常可以使用更易读的方法。

答案 6 :(得分:0)

每当你需要乘以2时;)

我唯一的用途是互操作性代码和位域:

http://www.codeproject.com/KB/cs/masksandflags.aspx