我编程了一段时间,我从未使用过移位运算符。我可以看到它如何在计算Tuple<T>
中的哈希码时有所帮助,但除此之外,
答案 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 << 27
比134217728
更容易,也更容易理解。
答案 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)