3

可能重复:
何时在 C# 中使用 Shift 运算符 << >> ?

我已经编程了一段时间,但我从未使用过 shift 运算符。我可以看到它对计算像 in 这样的哈希码有什么帮助Tuple<T>,但除此之外,

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

4

7 回答 7

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();
}
于 2011-05-03T22:15:13.040 回答
10

写出二的幂很有用。

快速: 2 27是什么?
回答:1 << 27

写作1 << 27134217728.

于 2011-05-03T22:12:29.387 回答
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);

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

于 2011-05-03T22:47:07.617 回答
2

如果您需要在不使用 *的情况下进行乘法运算,如何在 .NET 中不使用乘法运算符来实现乘法运算:)

或者编写一个数独求解器数独有效性检查算法——这段代码是如何工作的?

在实践中,我唯一一次看到它在我的(有限的)经验中被用作(可以说)令人困惑的乘法方式(参见第一个链接)或与设置 BitFlags(上面的数独求解器)结合使用。

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

于 2011-05-03T22:17:39.073 回答
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)
};
于 2011-05-03T22:18:45.777 回答
0

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

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

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

于 2011-05-03T22:19:07.050 回答
0

每当您需要乘以 2 时;)

实际上,我唯一的用途是用于互操作性代码和位域:

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

于 2011-05-03T22:20:09.117 回答