【问题标题】:Mapping 32 bit value to different Status for each bit将 32 位值映射到每个位的不同状态
【发布时间】:2012-03-19 11:49:08
【问题描述】:

我需要实现某种位到状态的映射,但我不知道如何实现这个东西 - 也许我有一个笨蛋;)

好的,所以我有一个可以最大的状态码。 32 位长,例如 1001 0011 每个位都属于一个特殊的状态码——字符串。

例如:

Bit 1: String Cancel
Bit 2: String Okay
Bit 3: String Save
....
Bit 32: String Next

现在我必须确定设置了哪些位并返回所有状态代码 - 设置为 32 位长状态的字符串。

我更喜欢某种字典或 sumthin 之类的,我可以为每个位存储相应的状态代码。

然后我喜欢循环通过 32 位长状态码并从字典中获取相应的状态码字符串 - 将其存储在字符串中并在循环通过 32 位长状态码后返回。

有人对此有想法吗?

【问题讨论】:

  • @wiero:将此作为答案发布,因为这是正确的方法。
  • @DanielHilgarth - 你真的有超过一百万条不同的状态信息吗? 32位似乎有点矫枉过正。如果您有超过 256 条不同的状态消息,至少我对这个主题的看法是,您做错了什么。甚至有办法将 2 个字节扩展为超过 256 条消息。
  • @Ramhound:我假设你想向 OP 提出这个问题,而不是我......但是使用 32 位整数,你会得到 32 条不同的状态消息,如果每个位代表一个状态消息为由 OP 定义:如果设置了位 1,则为状态消息 1。如果设置了位 2,则为状态消息 2,依此类推。当然,您可以组合这些位,但仍然只有 32 种不同的状态消息。这些状态消息只有 2^32 种不同的组合...
  • 您好,Daniel H. 在正确的轨道上。每个位都代表一个状态 - 代码/字符串/消息 - 随心所欲地调用它。如果设置了两位,则不会导致这两位之和的新状态代码。它导致返回两个状态代码字符串。

标签: c# map status bit


【解决方案1】:

你可以使用带有 flags 属性的枚举。枚举可以从 int 转换为 int。 可以设置每个枚举值,以便您的状态看起来像这样

[Flags]
enum Status { None = 0 , Cancel = 1 , Ok = 2 , Save = 4 ... } 

标志属性

表示可以将枚举视为位域;那是, 一组标志。

你可以测试

 if ((status & Status.Ok) == Status.Ok)
 {
 // Do something
 }

【讨论】:

  • 请注意,[Flags] 不是严格要求的,仅从 ToString() 产生更好的结果。
  • 我还看到... Cancel = 1 << 0, Ok = 1 << 1, Save = 1 << 2 ... 为那些不喜欢二进制计数的人提供服务。
  • 所以我必须用“if”语句“手动”检查所有 32 个案例?如果状态设置了多个位怎么办
  • 您可以混合状态并定义 Completed = Ok |节省 。如果涉及到处理不同的状态,您可以创建字典,其中状态为键,处理程序为字典
猜你喜欢
  • 2018-05-15
  • 1970-01-01
  • 2018-06-24
  • 2012-09-07
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多