我最近在查看一个保存了一些神秘值的配置文件。我碰巧有源可用,所以我看看它在做什么,它保存了一堆不同的值,并将它们相互转移。令我迷惑的是为什么有人会这样做。那么我的问题是:以这种方式存储数字数据有明显的优势吗?我可以看到它可以为字节方式存储稍微小一点的值,但是保存几个字节的存储似乎需要做很多工作。它似乎也会明显变慢。
我遇到的另一种可能性是用于混淆目的。这是比特移位的常见用法吗?
答案 0 :(得分:11)
这是比特移位的常见用法之一。有几个好处:
1)位移操作很快。
2)您可以在一个值中存储多个标志。
如果您的应用具有多项功能,但您只想启用某些(可配置)功能,则可以执行以下操作:
[Flags]
public enum Features
{
Profile = 1,
Messaging = 1 << 1,
Signing = 1 << 2,
Advanced = 1 << 3
}
启用Messaging和Advanced的单一值将是:
(1 << 1) + (1 << 3) = 2 + 16 = 18
<add name="EnabledFeatures" value="18" />
然后要确定某个特定功能是否已启用,您只需执行一些简单的按位数学运算:
var AdvancedEnabled =
EnabledFeatures & Features.Advanced == Features.Advanced;
答案 1 :(得分:5)
在C,C ++和汇编等系统级语言中,位移似乎更常见,但我也在C#中看到它。然而,它并不常用于节省空间,因为这是两个典型原因中的一个(或两个):
任何以高级语言单独使用它来节省空间或模糊其代码的人几乎总是过早地优化(和/或是白痴)。空间节省很少能证明增加的复杂性,并且位移确实不足以阻止某人决定理解您的代码。
答案 2 :(得分:4)
我有一个项目可以存储一周内可用时间的日/小时矩阵。所以它有24x7值,必须以某种方式存储。
我选择将其存储为7个整数,因此每天用一个整数表示,每小时用一个整数表示。只是一个有用的例子。
答案 3 :(得分:1)
有时候(特别是在较旧的Windows编程中),将会有一个以“高阶”和“低阶”位编码的信息...而且有时需要转移以获取信息。我不是百分之百确定其背后的原因,除了它可以方便地返回一个64位值,其中包含两个32位值(因此您可以使用方法中的单个返回值来处理它)呼叫)。
我同意你关于不必要的复杂性的断言,但我没有看到很多应用程序在非常繁重的数字运算/加密技术之外的地方,这些必要。