位运算
Posted 邢亚柯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算相关的知识,希望对你有一定的参考价值。
位运算符
1、 11(0000 1011) 按位取反 ~11 (1111 0100)
13(0000 1101) 按位取反 ~13(1111 0010)
2、按位与 : 相同的位都为1才为1 11&13 (0000 1001)
3、按位或 :相同位有1个1即为1 11 | 13 (0000 1111)
4、按位异或 : 一样的为0,不一样的为1 11 ^ 13 (0000 0110)
5、按位左移 : 11<<1 (0001 0110) 末尾补0
2(0000 0010) 2<<1 (0000 0100)等于2的平方。
6、按位右移 : 11>>1 (0000 0101)左边补符号位 相当于 5 = 11/2
(正数则左边补0, 负数标准没有规定在左边补充的数字,分为逻辑右移和算术右移,具体由编译器决定。windows平台和gcc采取算术右移即负数补1)
逻辑左移=算数左移,右边统一添0
逻辑右移,左边统一添0
算数右移,左边添加的数和符号有关
常见的二进制位的变换操作
功能 示例 位运算
去掉最后一位 (101101->10110) x>>1
在最后加一个0 (101101->1011010) x<<1
在最后加一个1 (101101->1011011) (x<<1) | 1
把最后一位变成1 (101101 -> 101101) x | 1
把最后一位变成0 (101101 -> 101100) ( (x | 1) - 1 ) 或 (x >>1)<<1
最后一位取反 (101101 -> 101100) x^1
把右数第k位变成1 (1011001 -> 1011101 k = 3) x | (1<<(k-1))
把右数第k位变成0 (1011001 -> 1010001 k = 4) x & ~ (1<<(k-1))
右数第k位取反 (1011001 -> 1011101 k = 3) x ^ ( 1 << (k-1))
取末三位 (1011101 -> 101 ) x & 7
取末k位 (1011101 -> 1101 k = 4) x & ((1<<k) - 1)
取右数第k位 (1011101 -> 1 k = 3) x & ( 1 << (k-1)) 或 (x >> (k-1)) & 1
把右边连续的1变成0 (100101111 -> 100100000) x & (x+1)
把右边连续的0变成1 (100101000 -> 100101111) x | (x-1)
把右边起第一个0变成1 (100101000 -> 100101110) x | (x+1)
例题:
1、 unsigned long val = 0;
char a = 0x48;
char b = 0x52; // 数字由整型开始保存
val = b << 8 | a;
则 val = 21064
2、int Fun(int x ,int y)
{
return (x&y)+((x^y)>>1); //求两个数的平均值
}
3、判断一个非0整数是否是2的幂: n & (n-1)
以上是关于位运算的主要内容,如果未能解决你的问题,请参考以下文章
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字