位运算

来源:互联网 发布:java utf 8编码 编辑:程序博客网 时间:2024/06/08 07:54

位运算:是指二进制位的运算。

  • 位运算符:

  • “按位与”运算符(&)
    和高中数学中“且”逻辑运算差不多,即:0&0=0,1&0=0,0&1=0,1&1=1。
    例如3&5并不等于8,而是将3和8化成二进制,按照上面的运算规律逐一进行计算。
    用途:(1)清零。若想将一个单位清零,找一个二进制数让它与其进行“与”的运算 ,这个二进制数要满足原来的数中为1的位,新数中与之对应的要为0。
    (2)去一个数的指定位。
    (3)如果想将那一位数保存下来,进行运算时就让新数中相对应的数为1。

  • “按位或”的运算(|)
    与高中数学逻辑运算中“或”相似,两个相应的二进制只要有一个为1,该为就为1。
    0|0=0,0|1=1,1|0=1,1|1=1。

  • “异或”运算符(^)
    参加运算的两个二进制位如果同号则为0,异号则为1。
    0^0=0, 0^1=1, 1^0=1,1^1=0。
    用途:
    (1)使特定位翻转。
    (2)与0相^,保留原值。
    (3) 交换两个变量,不用临时变量。
    设a = 3,b = 4。使两个变量的值交换。
    a = a ^ b; b = b ^ a; a = a ^ b;

  • 取反运算符
    将二进制数按位取反,即 使1变成0,使0变成1。而不是~1的值是-1。

  • 左移运算符(<<)和右移运算符(>>)

左移,弃高位补低位。
右移,弃低位补高位。(用0补)
(2)位运算举例。
(3)位段
结构体可以以为单位作为成员(内存长度)。这种成员被称作“位段”或“位域”。

struct packed_data{    unsigned a: 2;    unsigned b: 6;    unsigned c: 4;    unsigned d: 4;    int i;}data;
  1. 位段成员类型要为unsigned 或int类型。
  2. 若某一段位段要从另一字开始存放,两端位段中间可以使用
    unsigned :0。
  3. 一个位段必须放在一个存储单元中。
  4. 可以定义无名位段。如 unsigned :2,这两位空间不可用。
  5. 位段的长度不可以大于存储单元的长度。
  6. 可以用整形格式输出,也可以用%o,%u, %x。
  7. 位段可以在数值表达式中被引用。它会自动被系统转化成整型数。
    data.a+5/data.b