【问题标题】:Bit Operations with Enumerated Type枚举类型的位操作
【发布时间】:2012-10-07 21:58:44
【问题描述】:

我在开始使用我的实验室时遇到了一些问题。实验室有以下说明:

给定一个值int input = 0b10010110 确定个人喜欢什么运动。假设此输入中没有错误。从左到右,每个位置代表以下:足球、棒球、排球、游泳、垒球、足球、曲棍球、曲棍球。

如果在那个位置上有一个 1,那么这个人喜欢这项运动。根据给定的“二进制”输入,将用户喜欢的所有运动输出到屏幕上。对于给定的二进制数,用户喜欢足球、游泳、足球和曲棍球。

  • 不要创建字符数组。

  • 请务必使用枚举数据类型。

我不确定如何比较字符串的每个位置来判断它是 1 还是 0。我的一个想法是使用枚举类型,将每项运动设置为十位数字,其中只有它的合适的位置是 1

enum sport{
    Football = 0010000000,
    Baseball = 0001000000,
    Volleyball = 0000100000, 
    ... , 
    Lacrosse = 0000000001
};

然后,我将在给定值“输入”上左/右移动适当的次数,以仅保留指定位置的原始值并将所有其他值设置为 0。对于足球:

input << 2; input >> 9; input << 7;

所以新的设置值是0010000000。然后我就可以将这个数字作为一个整体进行比较。对于每种情况,我都必须这样做,但我想不出另一种方法来做到这一点。

我完全没有了?有没有更实用的方法来使用位操作检查每个位置的值?感谢您提前提供任何帮助。

【问题讨论】:

  • 除了位移位以外,还有其他运算符更适合检查一位。

标签: c bit-manipulation enumerated-types


【解决方案1】:

使用按位与运算符&amp;:

if (input & Football) {
    // Football bit is set
} else {
    // Football bit is not set
}

另请注意,0b 前缀是编译器扩展,但不是标准 C。在您的 enum 值中,以 0 前缀开头的数字是八进制格式(您必须解决此问题)。我建议您使用十六进制格式进行位操作。

【讨论】:

  • 所以 AND 运算符让我绕过输入值的移位和操作,对吗?你能给我更多关于你对 0b 前缀的意思的信息吗?必须使用值“输入”,由我们的讲师提供给我们。我会用不同的前缀开始我的枚举值吗?
  • AND 运算符的实现比我最初认为我会使用的所有转换要简单得多。我决定为我所有的枚举类型添加前缀“0b”,并且程序可以正常工作。感谢您的帮助。
【解决方案2】:

如果您通过将 1 向左移动适当数量的位置来定义您的运动价值观,那么您可以使内容更具可读性;事实上,您可以对运动值使用一个简单的枚举,并使用它来指定要移位多少位。

【讨论】:

  • 然后我会将移位后的值与某个常数(如 0010000000)进行比较,对吗?每项运动向左移动的数量是它的枚举值 Football = 0, Baseball = 1, ... 抱歉,我只是想确保我理解你想说的话。
  • 没问题——这就是我们在这里的原因。您将使用枚举值作为移动 1 的位置数(如 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2018-10-18
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多