枚举类型的位操作

时间:2012-10-07 21:58:45

标签: c bit-manipulation enumerated-types

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

  

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

     

如果在该位置有1,则该人喜欢该运动。基于给出的“二进制”输入,将用户喜欢的所有运动输出到屏幕。对于给定的二进制数,用户喜欢,足球,游泳,足球和曲棍球。

     
      
  • 不要制作一个字符数组。

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

  •   

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

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

然后我会在给定值“input”上向左/向右移动适当的次数,只留下指定位置的原始值,并将所有其他值设置为0.对于Football:

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

因此新的设定值为0010000000。然后我就可以将这个数字作为一个整体进行比较。对于每种情况,我都会这样做,但我想不出有不同的方法。

我完全离开了吗?是否有更多功能方法使用位操作检查每个位置的值?感谢您提前获得任何帮助。

2 个答案:

答案 0 :(得分:0)

使用按位AND运算符&

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

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

答案 1 :(得分:0)

如果通过将1向左移动适当数量的位置来定义运动值,则可以使事情更具可读性;实际上,您可以对运动值使用简单的枚举,并使用它来指定移位的位数。