我已经编程了一段时间,但我从未使用过 shift 运算符。我可以看到它对计算像 in 这样的哈希码有什么帮助Tuple<T>
,但除此之外,
7 回答
一般来说,它不经常使用。但是在处理位级操作时它非常有用。例如打印出数值中的位
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();
}
写出二的幂很有用。
快速: 2 27是什么?
回答:1 << 27
写作1 << 27
比134217728
.
我在处理硬件时经常使用它。这不是您在 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);
这些可能不是你每天都会做的事情。但对于我们这些经常与硬件接口的人来说,它们是。
如果您需要在不使用 *的情况下进行乘法运算,如何在 .NET 中不使用乘法运算符来实现乘法运算:)
或者编写一个数独求解器数独有效性检查算法——这段代码是如何工作的?
在实践中,我唯一一次看到它在我的(有限的)经验中被用作(可以说)令人困惑的乘法方式(参见第一个链接)或与设置 BitFlags(上面的数独求解器)结合使用。
在 .NET 中,我很少需要在位级别上工作。但如果你需要,能够转变是很重要的。
位运算符有利于节省空间,但如今,空间几乎不是问题。
乘以 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)
};
当需要操作单个位时使用位移位。例如,您会在许多加密算法中看到很多位移。
在优化中,它可以用来代替乘法/除法。左移等于乘以 2。右移等于除法。您可能不再看到这样做了,因为这种优化级别通常是不必要的。
除此之外,我想不出很多使用它的理由。我以前见过它,但很少在真正需要它的情况下使用,通常可以使用更易读的方法。