为什么要换位?

Jer*_*acs 11 c# bit-manipulation

我最近在查看一个保存一些神秘值的配置文件.我碰巧有源可用,所以我看看它在做什么,它保存了一堆不同的值,并将它们相互转移.令我迷惑的是为什么有人会这样做.那么我的问题是:以这种方式存储数字数据有明显的优势吗?我可以看到它可以为字节方式存储稍微小一点的值,但是保存几个字节的存储似乎需要做很多工作.它似乎也会明显变慢.

我遇到的另一种可能性是用于混淆目的.这是比特移位的常见用法吗?

Jus*_*ner 11

这是位移的常见用法之一.有几个好处:

1)位移操作很快.

2)您可以在单个值中存储多个标志.

如果您的应用程序具有多个功能,但您只想启用某些(可配置的)功能,则可以执行以下操作:

[Flags]
public enum Features
{
    Profile = 1,
    Messaging = 1 << 1,
    Signing = 1 << 2,
    Advanced = 1 << 3
}
Run Code Online (Sandbox Code Playgroud)

您启用Messaging和Advanced的单一值将是:

(1 << 1) + (1 << 3) = 2 + 16 = 18

<add name="EnabledFeatures" value="18" />
Run Code Online (Sandbox Code Playgroud)

然后要确定某个特定功能是否已启用,您只需执行一些简单的按位数学运算:

var AdvancedEnabled = 
    EnabledFeatures & Features.Advanced == Features.Advanced;
Run Code Online (Sandbox Code Playgroud)


cHa*_*Hao 5

在C,C++和汇编等系统级语言中,位移似乎更常见,但我也在C#中看到它.然而,它并不经常用于节省空间,因为它是两个典型原因中的一个(或两个):

  • 您正在与现有系统(或使用已建立的协议,或以已知格式生成文件)进行交谈,这需要非常精确地布置内容; 和/或
  • 位组合包含一个本身可用于测试的值.

任何以高级语言使用它只是为了节省空间或模糊其代码的人几乎总是过早地优化(和/或是一个白痴).节省空间很少能证明增加的复杂性,并且位移确实不够复杂,无法阻止某人决定理解您的代码.

  • @David:那......是*不应该*使用的一个主要例子.至少直到你描述并发现你的应用程序太慢,因为你正在阅读两个会话参数而不是一个.(PROTIP:除非你是微软,否则很可能***不是***.远,*远*更可能是你的算法很糟糕.) (2认同)