位运算

来源:互联网 发布:java style标签 编辑:程序博客网 时间:2024/06/03 16:19

手工位操作

  • ^表示XOR(异或)操作
  • ~表示非(取反)操作
  • 一个数与这里写图片描述相乘,相当于这个数左移n位
  • ~0的值就是一串1,将它左移n位后的结果就是一串1后面跟n个0。x&(~0 << n)的操作会将x最右边的n位清零。
  • 左移运算符m << n表示把m左移n位。左移的时候,最左边的n位将被丢弃,同时在最右边补上n个0。
  • 右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但右移处理时左边位的情形要复杂一些如果数字是一个无符号数值,则用0填补最左边的n位。如果数字是一个有符号数值,则用数字的符号位填补最左边的n位。也就是说,如果数字原先是一个正数,则右移之后在最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1。
  • hh

位操作的原理与技巧

以下示例中的“1s”和“0s”分别表示一串1和一串0

  • x ^ 0s = x,因为异或操作,相同数字为0,不同才为1,所以只有1^0=1,而0^0=0。
  • x & 0s = 0
  • x | 0s = x
  • x ^ 1s = ~x,因为异或操作,相同数字为0,不同才为1,所以只有1^0=1,而1^1=0。
  • x & 1s = x
  • x | 1s = 1s
  • x ^ x = 0,因为异或操作,相同数字为0,不同才为1,所以只有1^1=1,0^0=0。
  • x & x = x
  • x | x = 0
    所有位操作是按位进行的,某一位的运算结果不会影响其余位。也就是说上述语句对某一位成立,则同样适用于一串位。

常见位操作:获取、设置、清除及更新位数据

获取

  该方法将1左移i位,得到形如00010000的值。然后将这个值与num进行按位与运算,从而将i位之外的所有位清零。最后检查该结果是否为0。不为0说明第i位是1,否则i位是0。
  

bool getBit(int num,int i){    return ((num&(1<<i)) != 0);}

置位

  setBit**先将1左移i位,得到形如00010000的值。然后将这个值与num进行按位或**运算,这样只会改变i位的数据。这个掩码i位以外的位都是0,所以不会影响num的其他位。

int setBit(int num,int i){    return num|(1<<i);}

清零

  该方法与setBit刚好相反。先将1左移i位,得到形如00010000的值,进而对这个值取反得到类似11101111的掩码。接着将掩码与num进行按位与运算。这样只会将num的i位清零。

int clearBit(int num,int i){    return num&(~(1<<i));}

将num最高位至ffgd

0 0
原创粉丝点击