本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.6 位运算符
& | ~ ^ << >>
&:有0为0,全1为1
|:有1为1,全0为0
~:0为1,1为0
^:相同为0,不同为1
<<:将数值向左移动多少位
>>:将数值向右移动多少位
例如:
unsigned char x=0x17, y;
y = ~x;
x:0001 0111
y:1110 1000 ---> 0xE8
例如:
unsigned char x=0126, y=0xac, z;
z = x & y;
x:0101 0110
y:1010 1100
z:0000 0100 ---> 0x4
例如:
unsigned char x=076, y=0x89, z;
z = x | y;
x:0011 1110
y:1000 1001
z:1011 1111
例如:
unsigned char x=75, y=0173, z;
z = x ^ y
x:0100 1011
y:0111 1011
z:0011 0000
位移位运算的一般形式:
<运算量> <运算符> <表达式>其中:
<运算量> 必须为整型结果数值;
<运算符>为左移位(<<)或 右移位(>>)运算符;
<表达式> 也必须为整型结果数值。
以16进制打印:%#x 以8进制打印:%#0
例如:
unsigned char a=0xe4, b;
b=a<<3;
a:1110 0100
b:0010 0000
将数值a的第n位置1:
a | (1<<(n-1))
a=1010
1010
0100
推导该数:1的值:0001 左移2位:0100
1110 最终目的数
将数值a的第n位置0:
a & (~(1<<(n-1)))
a=1010
1010
1101 推导该数:1的值:0001 左移1位:0010 取反:1101
1000 最终目的数
不借助中间变量实现两个数值的交换:
a=a^b;
b=a^b;
a=a^b;
左移n位:扩大2的n次方倍
右移n位:缩小2的n次方倍
如何利用位运算把一个十进制数转化为一个十六进制数?(除以16,短除法)
涉及到取整和取余
b=a>>4
b=a&0xf
1.7 C语言的特殊运算符
1.7.1条件运算符"? :"
是三目运算符, 其运算的一般形式是:
<表达式1> ? <表达式2> : <表达式3>
表达式1 ?表达式2 :表达式3
当表达式1成立的时候执行表达式2,不成立执行表达式3
例如:
int x=82, y=101;
x >= y ? x+18 : y-100 //运算结果为1
x < (y-11) ? x-22 : y-1 //运算结果为60
int main()
{ int x, y=25;
x=70;
y= x++ > 70 ? 100 : 0 ;
printf(“x=%d y=%d”, x, y);
return 0;
}
运行结果: x=71 y=0
1..7.2 逗号运算符
括号中包含多个表达式,每个表达式之间用逗号进行分隔,从左往右依次计算,整个表达式的值是最后一个表达式的结果,但是前面的所有表达式都会执行
float x=10.5, y=1.8, z=0;
z = (x+=5, y = x+0.2) ;
z = (x=y=5, x +=1) ;
z = (x=5, y=6, x+y ) ;
z = (z=8, x=5, y=3) ;
1.7.3 sizeof运算符
用于查看占用的空间
运算的一般形式:sizeof(<类型或变量名>)
注意:它只针对数据类型,而不针对变量!
例如:
int a
sizeof(a) --->4
sizeof(double)
sizeof(long)
……
综合:
例如:
int x=1, y=0, z=0;
x++ && y++ || ++z //结果为 1 (2 1 1)
! (x+1>0) && y++ || ++z //结果为 1 (1 0 1)
x += y==z, y=x+2, z=x+y+x >0//x为2,y为4 ,z为1