1、简介
& :按位与,主要用于将某个数 清零 或 取某几位
| :按位或,常用来将某个数的某一位 设为 1
^ :按位异或,常用来做特定位的反转,或与 0 异或 从而保留原值
例: 交换两数
int a=2 , b=3; 用异或交换两个数
a = a^b; // 0010^0011 = 0001 (a=1)
b = a^b; // 0001^0011 = 0010 (b=2)
a = a^b; // 0001^0010 = 0011 (a=3)
~ :按位取反
<<:按位左移,左移时不超出数据界限则,相当于 *2^n,左移后右端补0,
>>:按位右移,左端补 0 or 1,视原数符号而定
2、不同长度数据位运算
若进行位运算的两数长度不同,则运算时系统将二者按 右端对齐,左端补 0 or 1
3、3种编码方式
原码:符号位 + 真值的绝对值
反码:负数则在原码的基础上,符号位不变,其余各位取反
正数的反码为其本身
补码:负数则在反码的基础上+1
正数的补码为其本身
4、位段
定义:以位为单位定义结构体(或联合体)中的成员变量所占空间
格式:type [var] : digit
注:type 只能为 int 、unsigned int 、signed int 三种类型
var是位段名称,为可选参数,即可省略
digit 是成员所占的二进制位数
例:
struct node
{
unsigned int m: 4; // 位段a,占4位
unsigned int : 0; // 无名位段,占0位
unsigned int n : 4; // 位段b,占4位
int a :32; // 位段c,占32位
};