C语言有六个位运算符。
按位
|按位或
^按位异或
取反
向左移动的话,相当于*2
向右移动,正的高位补充0,负的位由计算机决定
循环k次(xk )|(x ) 32-k ) ),
循环k次(xk )|(x ) 32-k ) )
当然在优先顺序的问题上犯错误的情况很多~~~
优先顺序和口诀如下
优先级运算符记忆战术1 () [] . -括号成员第一; //括号运算符[] (成员运算符. -
整体单眼第二; //所有单眼运算符例如为---、- (负)、指针运算*、乘除馀数三、加减四//所谓该"馀"为馀数运算,取%
班次五、关系六; //移位运算符:关系:==等
不相等列第七); //即==和!=
位和异或位或; //它们中的一些是位运算:位和(的异或) ^ (位或(|) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 652
“三分天下”八九十;
或逻辑和; //逻辑运算符:||和
十二和十一; //注意顺序:优先级(|)为优先级) )以下
条件高于赋值,//三目运算符的优先顺序为13比特只比赋值运算符和','高
逗号运算水平最低! //逗号运算符的优先级最低
2! ~ ((负) ) ) ) ) )。
- ()获取变量地址(*
(type ) )强制类型) sizeof
3*/%4 -5 6==7==!=89^10|1112||13?14==-=*=/=|=^==15,
位、运算位和运算符“”是双目运算符。 其功能是分别与参与运算的2个数相对应的二进制相和二进制相。 只有当相应的二进制数都为1时,结果位才为1,否则为0。 参与运算的数表现为补数。
例如,95表达式可能如下:
00001001(9的二进制补码) )。
00000101(5的二进制补码) )。
00000001(1的二进制补码) ) )。
可以看出95=1。
按位和运算通常用于将某些位清零或保持某些位。 例如,如果将a的前八位清除为0,保留后八位,则可以进行a255运算。 255的二进制数是0000000011111111。
位或运算位或运算符“|”是双目运算符。 其功能是分别对应于参与运算的两个数的二进制相或。 如果对应的两个二进制文件中的任何一个为1,则结果位为1。 参与运算的两个数都以补数出现。
例如,9|5可以编写以下表达式:
00001001
|00000101
00001101 (十进制为13 ) ) )。
知道9|5=13
异或运算异或运算符“^”是双目运算符。 其功能是,如果参与运算的两个数各自对应的二进制不同,或者两个对应的二进制不同,则结果为1。 参与运算数据仍然表现为补数,例如9^5可以写成如下公式:
00001001
^00000101
00001100 (十进制为12 ) ) )。
求逆运算求逆算子~是单眼算子,具有右结合性。 其功能是将参与运算的数的各二进制按比特反转。 例如,~9的运算如下所示。
~(0000000000001001 ) () ) ) )。
结果是11111111111111110110
左移运算左移运算符“”是双目运算符。 其功能是将“”左操作数的各二进制文件全部左移若干位,指定“”右数要移位的位数,舍弃高位,低位补0。 例如:
a4
指将a的每个二进制文件左移四位。 如a=0000011 (十进制3 )所示,向左移动4位即为00110000 (十进制48 )。
右移运算右移运算子「」是双目运算子。 其功能是将“”左侧操作数的各二进制文件全部向右移位几个,然后单击
gt;”右边的数指定移动的位数。例如:设 a=15,
a>>2
表示把000001111右移为00000011(十进制3)。
注意:对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,
最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
简单运用
一:交换两个数(字符),不用第三个变量就可以交换两个变量的值了:
用异或^,原理:两次异或能还原,即a = (a^b) ^ b
二:判断一个数是不是2的幂次:
原理:2的幂次的二进制表示中只有一位是1,其他位为0
x = x&(x-1)是让x的二进制码最右侧的1置为0,如果结果为0就表示原先x只有1位是1,其他位为0
inline bool is2pow(int x) { return (x&(x-1)==0 && (x!=0)); }
inline bool is2pow(int x) { return ( (x&-x)==x ); }
三:求一个整数有多少位是0:
原理同上。用x&(x-1)
1 int count = 0;2 while(x)3 {4 ++count;5 x &= (x-1);6 }
四:二进制快速求幂:
1 long pow(int x, unsigned int n){2 long p = 1;3 while (n){4 if (n & 1) p *= x;5 x *= x;6 n >>= 1;7 }8 return p;9 }
五:判断奇偶数:
原理:奇数最后一位为1,偶数为0
inline bool odd(int x) { return x&1; }
inline bool even(int x) {return !(x&1); }
n%2 = n&1
n%4 = n&3
n%8 = n&7
……
六:求x绝对值:
原理:x为正数时不做改变,为负数时取反加1
x为正数时y = 0 = 0000 0000 0000 0000
x为负数时y = -1 = 1111 1111 1111 1111
跟0异或是本身,跟1异或是取反
1 inline int abs(int x){2 int y = x >> 31;3 return ( x^y-y);4 }
七:对2的幂次取模:
原理:x&y取出x和y二进制位1的所有位。x^y>>1取出x,y只有一个二进制位1的并除以2
return (x&y) + (x^y)>>1);
不用位运算时注意 (x+y)/2,有可能会溢出。
x向上取整到y,其中y=2^n (字节对齐用):
#define rund(x,y) ( ((x)+(y)-1)&~((y)-1) )
八:其他:
只有第k位为1的数 1 << (k-1)
后k位为均为1的数 (1<<k)-1
x 的第k+1位 x >> k &1
x的第k+1位置1: x >> k |(1 << k)
x的第k+1位置0: x >> k &~(1 << k)
注意:左移1位再右移1位不一定时原先的值
至于高深用法可以戳戳这里 :http://www.cnblogs.com/tdyizhen1314/archive/2012/04/03/2431122.html
转载于:https://www.cnblogs.com/zyxStar/p/4564335.html