一般地,我们要确认某个字节a的某位是否为1,
byte ifbit1( byte a ){ // 第一位
return a&0x01;
}
byte ifbit4( byte a ){ // 第4位
return a&0x10;
}
而要确定的位是由变量p指定时,
byte ifbit( byte a, int p ){
byte one = (0x01<<p);
return a&one;
}
再看,如何给某个字节的位置数操作
byte setbit1( byte a ){
return a|0x01;
}
byte clearbit1( byte a ){
return a&0xFE; // a&(0xFF-0x01)
}
同样的,看看由变量p指定的位时的情况:
byte setbit( byte a,int p){
byte one = (0x01<<p);
return a|one;
}
byte clearbit( byte a,int p ){
byte one = (0x01<<p);
return a&(0xFF-one);
}
虽然这些操作非常简单, 但是写成函数,确实非常方便地对位操作进行了封装,还是很有必要的, 尤其是对32位或者64位操作时, 很容易少写或者多写一个0之类的.
还有一种不使用函数的方法,就是定义好位的常量, 直接调用常量来操作.不仅可以增加执行效率,还可以减少函数调用产生的栈操作.
static const byte sbit8[8] = { 0x01, 0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
static const byte cbit8[8] = { 0xFE, 0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F };
a&sbit8[p]; // 查看p位是否为0
a|sbit8[p]; // 置位
a&cbit8[p] // 清除位