位运算

按位运算符:

  • & 按位的与
  • | 按位的或
  • ~ 按位取反
  • ^ 按位的异或
  • << 左移
  • >> 右移

按位与&:

  • 如果(x)==1并且(y)==1,那么(x&y)=1,否则它等于0,即同真则真
  • 按位与常用的两种应用:
  • 让某一位或某些位为0:x & 0xFE
  • 取一个数中的一段:x & 0xFF

按位或|:

  • 如果(x)==1或(y)==1,那么(x|y)=1,否则等于0,即有一个为真就为真
  • 按位或常用于:
  • 使得一位或几个位为1:x | 0x01
  • 把两个数拼起来:0x00FF | 0xFF00

按位取反~:

  • (~x)=1-(x)
  • 把1位变0,0位变1
  • 想得到全部为1的数:~0
  • 7的二进制是0111,x | 7 使得低3位为1,而x & ~7 ,就使得低3位为0

按位异或^:

  • 如果(x)==(y),那么(x^y)=0,否则(x^y)==1
  • 如果两个位相等,那么结果为0,不相等,结果为1
  • 如果x和y相等,那么x^y的结果为0
  • 对一个变量用同一个值异或两次,等于什么也没做
  • x^y^->x

左移<<:

  • i << j
  • i 中所有的位向左移动 j 个位置,而右边填入0
  • 所有小于int的类型,移位以int的方式来做,结果是int
  • x <<=1 等价于 x *=2,x <<= n等价于x *=2n

右移>>:

  • i >> j
  • i 中所有的位向右移 j 位
  • 所有小于int 的类型,移位以int的方式来做,结果是int
  • 对于unsigned的类型,左边填入0
  • 对于signed 的类型,左边填入原来的最高位(保持符号不变)
  • x >>=1 等价于 x /=2, x >>=n 等价于 x /=2n

注意:

移位的位数不要用负数

位段:

把一个int的若干位组合成一个结构

struct{

  unsigned int leading : 3;//冒号后面数字说明leading占据几个比特,下面同理

  unsigned int FLAG1 : 1;

  unsigned int FLAG2 : 1;

  int trailing : 11;

};

posted @ 2023-03-30 22:23  xxxbai  阅读(64)  评论(0)    收藏  举报