在C语言中,^
和 ~
是位运算符(其实也就是按位运算符),只能用于整数类型
^
为按位异或运算符,它对两个整数的每一位进行比较,如果两位相同则结果为0,不同则结果为1
按位异或(XOR)是位运算中的一种操作,主要用于对两个二进制位进行比较
int main() {
int a = 5; // 二进制为 0101
int b = 3; // 二进制为 0011
int result = a ^ b; // 结果为 0110,即6
printf("a ^ b = %d\n", result); // 输出:a ^ b = 6
return 0;
}
当你使用^
运算符时,结果是在二进制水平上进行计算的,但最终输出的值是以十进制形式表示的
同时,结果的整数类型与输入的整数类型相同。例如,如果输入是int
类型,则结果也是int
类型
最终通过printf
输出时,你可以以十进制或其他指定的数制格式来显示结果(%d、%x等等)
~
为按位取反运算符,它对一个整数的每一位进行取反操作,0变为1,1变为0
int main() {
int a = 5; // a的二进制为 0000 0000 0000 0000 0000 0000 0000 0101
int result = ~a; // result 将是按位取反后得到的值
printf("a = %d\n", a); // 输出原始值
printf("~a = %d\n", result); // 输出取反后的值
return 0;
}
和按位异或运算符一元,它运算后以十进制形式存储
你也可以通过选择%d、%x、%o(八进制)等等去改变它的输出进制类型
//临时记一下:
%.f
后面的数字表示小数点后要保留的位数。例如,%.2f
表示保留两位小数
如果没有数字,即 %.f
,则表示不保留小数部分,结果会是一个整数
按位运算符是用于对整数的二进制位进行直接操作的运算符,上面的按位异或和按位取反都是按位运算符,你可以就叫异或运算符和取反运算符
再来看看char a=064,一开始会很奇怪,因为我查了ascii表没有发现064这个ASCII值,然后我发现,字符(串)常量不仅可以用‘’,也可以用进制表示,这里说的char定义变量中的ascii值本质是十进制,懂了吧
在C语言中,默认的数值表示是十进制
八进制数以0
开头,正如上面的064
十六进制数以0x
或0X
开头,如0x2A
按位与运算符&
对应位均为1时,结果才为1;否则为0
int a = 5; // 二进制为 0101
int b = 3; // 二进制为 0011
int result = a & b; // result 为 1(二进制 0001)
按位与运算符也是用于两个整数之间,如上所述
按位或运算符 |
对应位只要有一个为1时,结果为1;均为0时,结果才为0
//我感觉这两个其实就是逻辑运算符啊,简直一模一样
左移运算符<<
意思是将一个二进制数的所有位向左移动若干位,同时在右边用0填充
其实,对于一个二进制数,每左移一位,就相当于将这个数乘以2(这是因为二进制的每一位都代表了2的指数)
到时候你在转成十进制看看就行了
在这里再来谈谈他们的运算优先级了
~取反是一元运算符,而^按位异或是一元运算符,而^异或运算符和按位或、按位与都是二元运算符,所以~一元运算符优先级高,先算
位运算符优先级比较
先取反~,后左右移,然后按位与&,按位异或^排在后,按位或 | 是老末
//现在下午去图书馆,有个题目的知识点得记一下,进行按位与运算(类似的都同理)时,如果二进制数的位数不相等,通常会将短的二进制数用前面补零的方式扩展到与长的二进制数的位数相同。然后,逐位进行与运算
还有,在二进制表示中,数值的前导零并不会对数值本身产生影响,因为它们在数值上是无意义的,但可以提高可读性
补:左移 n
位相当于将数值乘以 2n。因此,左移 2 位相当于乘以 4
11.18 晚自习 补:
右移运算符 >>
我们已经知道,在一个二进制数前面补零对这个数是没有任何影响的
左移运算符是往后面补0,就实现了它的乘以 2^n的操作
但是右移运算符不一样了,它会舍命陪君子
你对一个整数 n
使用右移运算符 >>
时,所有的位都会向右移动指定的位数
如果是负数,左侧填充 1(保持符号位),如果是正数,左侧填充 0,这毫无影响
同时,他会舍弃最后面的二进制数,例如,如果 n
的二进制表示是 11101
(即十进制的29),执行 n >>= 1
后,n
的值会变为 01110
(即十进制的14)
最后面的1被舍弃了
这其实相当于n 除以2并舍去余数(等价于非浮点数的除法运算)
Comments NOTHING