版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/dcrmg/article/details/83350710
C中的位运算
- &: 按位与(两者同为1则为1,否则为0)
- |:按位或 (两则同为0则为0,否则为1)
- ^: 按位异或(两则相同则为0,相异则为1)
- ~: 取反 (1取0,0取1)
- <<:左移 (相当于乘2)
- >>:右移 (相当于除2)
验证:
#include <stdio.h>
int main()
{
int a = 5; //101
int b = 3; //011
printf("%d\n",a&b); //001 值为1
printf("%d\n",a|b); //111 值为7
printf("%d\n",a^b); //110 值为6
printf("%d\n",~a); //0000 0101 取反是 1111 1010 补码是 1000 0101 补码是 1000 0110 是-6
printf("%d\n",a<<1); //1010 值为10
printf("%d\n",a>>1); //010 值为2
system("pause");
return 0;
}
这里特别要注意的是取反操作,取反之后得到的是原码,而在计算机内部二进制是以补码形式存储的,所以最终的取反结果还要转换成补码的形式,补码表示的才是真实的结果!
例如上例中,(假如是8位机)5 的二进制是 0000 0101,取反后(原码)是 1111 1010, 反码是 1000 0101 ,补码是 1000 0110 ,转换成十进制值是 -6 !
注: 原码、反码与补码
原码: 第一位表示符号(0正1负), 其余位表示值;
反码: 正数的反码是其本身; 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
补码: 正数的补码就是其本身; 负数的补码是在反码的基础上+1。
C中的逻辑运算
- &&: 与运算(两者都为真则真,否则为假)
- ||: 或运算 (两者中有真则真,否则为假)
- !: 非运算 (真变假, 假变真)
验证:
#include <stdio.h>
#define true 1
#define false 0
int main()
{
int a = true;
int b = false;
printf("%d\n",a&&b); //false
printf("%d\n",a||b); //true
printf("%d\n",!a); //false
system("pause");
return 0;
}
注意: C语言本身没有bool变量,可以通过#define宏定义模拟true和false。