位操作符("&"按位与,"|"按位货,"^"按位异或)
都是按二进制,他们的操作数必须是整数,不能用于浮点数。
按位与&:
int a=3 0000....0011
int b=-5 1111....1011
int c=a&b
printf("%d\n",c)
输出c=3 0000....0011
总结:有0为0,全1为1
按位或|:
int a=3 0000....0011
int b=-5 1111....1011
int c=a|b
输出c=-5 1000...0101(这是补码变成原码后)
总结:全0为0,有1为1
按位异或^:
int a=3 0000....0011
int b=-5 1111....1011
int c=a^b
输出c=-8 1000....01000(补码变成原码后)
总结:相同为0,不同为1
例题:不能创建临时变量(第三个变量),实现两个数的交换。
(常规)我们会拿第三个变量作为交换媒介
int a=5
int b=3
int c=0
a=b
c=a
b=c
这里利用位操作符:
在使用之前我们需要了解:3^3=0
3^3^5=5 3^5^3=0
异或操作符支持交换律
单目操作符,只有一个操作数
a+b,双目操作符,"+"操作符有两个操作数
单目操作符
! //逻辑反操作
- //负值
+ //正值
& //取地址
sizeof //求操作数的类型长度(以字节为单位)
~ //对一个数的二进制按位取反
-- //前置、后置减减
++ //前置、后置加加
* //间接访问操作符(解引用操作符)
(强制类型转换) //强制类型转换
这里说明一下"~" 二进制按位取反
int a =0 0000....0000
printf("%d",~a) 1111....1111(这是补码)
输出a=-1 1000...0001(这是原码)
如果要修改二进制中的0,变成1,可以让1左右移,使用移位操作符。
例:
要想把变的那个数字变回原来的数可以,按位取反
重点还是:按位与& 有0则0,全1为1
按位或| 有1则1,全0为0
按位异或^ 相同为0,相异为1
"++"和"--"(使用方法是一样的,这里说++)
例:先++,后使用
本质上是b=加完后的a,a变成了4给了b
先使用,后++
本质上是b先等于a变成3,后面a再++变成4
"*" 解引用操作符
*p 通过p里的地址找到它所指向的对象
"(类型)强制类型转换"
举例:
关系操作符
>,<,>=,<=,!=,==
关于"==",在比较字符串时
"abc"=="acbdef",是不行的,这里比较的是两个字符串的首字符地址
应该用库函数strcmp,头文件#include<string.h>
strcmp("abc","acbdef")==0 若相等则判断为0
若不等则判断不为0