int a= 1 << 0 // 向右偏移2的0次方,返回01 int b= 1 << 1 // 向右偏移2的1次方,返回10 int c= 1 << 2 // 向右偏移2的2次方,返回100 int d= 1 << 3 // 向右偏移2的3次方,返回1000 int value = a|b ; //表明value中包含a或者b //&表示包含 printf(@"%d%d%d%d",value&a,value&b,value&c,value&d) //打印结果:1 2 0 0,如果返回原来的数值则表示包含,返回0表示不包含,因为value为1111(a+b),0011 与 01 ->(0001,注:1与1才为1,否则都为0),0011 与 10 ->(0010,注:1与1才为1,否则都为0),上面两个都是返回自己本身,所以表示包含,再看看下面两个,0011与0100 ,返回 0000,0011与1000,返回 0000,所以下面两个都返回0,不包含
下面参与与运算
// value 0011 value 0011 // a 0001 b 0010 //结果 0001 结果 0010 // value 0011 value 0011 // c 0100 d 1000 //结果 0000 结果 0000
测试代码如下
int a= 1 << 0; // 向右偏移2的0次方,返回01 int b= 1 << 1; // 向右偏移2的1次方,返回10 int c= 1 << 2; // 向右偏移2的2次方,返回100 int d= 1 << 3; // 向右偏移2的3次方,返回1000 void test(int value); void main(){ int value = a|b ; //表明value中包含a或者b test(value); } void test(int value){ if(value & a) printf("value包含了a "); if(value & b) printf("value包含了b "); if(value & c) printf("value包含了c "); if(value & d) printf("value包含了d "); }
得出结论,之后如果使用枚举时,如果返回多个值可以用位运算来实现,否则只能返回一个数值