C中位运算、逻辑运算

版权声明:本文为博主原创文章,转载请注明出处。 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

猜你喜欢

转载自blog.csdn.net/dcrmg/article/details/83350710