C++中的基本关键词及语法(逻辑部分)

  • 逻辑关键词&(逻辑位与)、|(逻辑位或)、~(逻辑位非)、!(逻辑非)、&&(逻辑与)、||(逻辑或)、<<(位左移)、>>(位右移)
    1. 逻辑位与&、逻辑位或|、逻辑位异或~
      a. 逻辑位与&,逻辑位与的作用就相当于逻辑电路里的一个与门,其真值表如下:

      同样地,&=(某一变量等于某一变量与某数的逻辑位与),例如:通过逻辑位与把一个整形数15变成11.代码如下:
#include <iostream>
using namespace std;
int main(){
    int a = 0xf;       //0x表示十六进制数,f表示15,二进制表示1111
    a &= 0xb;          //0xb二进制表示1011,变量a与1011作逻辑位与运算得1011(可参照以上真值表)
    cout << a;         //输出结果即为11
    return 0;
}
    b. 逻辑位或|,相当于电路里的逻辑非门,其真值表如下:

这里写图片描述
同样地,|=表示某变量与某数的按逻辑位或得到的值再赋给该变量,例如:通过逻辑位或将整形数3变成整形数15,代码如下:

#include <iostream>
using namespace std;
int main(){
    int a = 0x3;
    a |= 0xc;        //0xc表示为二进制数1100,与0011作或运算得到1111即为15
    cout << a;
    return 0;
}
    c. ~逻辑位非,与逻辑位与和或不同的是,逻辑电路非门只有一个输入口,其真值表如下:


值得注意的是,~=是错误的语法,但例如 a = ~a是成立的。例如将整形数3通过逻辑非变为-4,代码如下:

#include <iostream>
using namespace std;
int main(){
    int a = 0x3;
    a = ~a;            //这里值得注意的是全部位取反后,int数为32位,即原来0000 0000 0000 0011,现取反后为1111 1111 1111 1100,按照计算机存放数字的规则,该数是以补码的形式存在,即原数字为-4
    cout << a;         //此处输出为-4
    return 0;
}
2. 逻辑与&&、逻辑或||,逻辑非!
    a. 逻辑与&&,此符号与&的区别为&表示按位取与,而&&则为整体的与,输出的结果为真或假,也即只要两个数字都不是非零数,则为真(true(1)),否则为假(false(0));同理||表示只要两个变量均为0,则结果为假(false(0)),否则为真(true(1)),要注意的是,逻辑非也只能针对变量本身,例如以下代码片段:
bool a = 3 && 5;   //这里a为true(1),因为3和5均为非零数
bool b = 'a' && 0; //这里b为false(0),因为字符a为非零,但和0作逻辑与
bool c = 0 || 1;   //这里c为true(1)
bool d = 0 || 0;   //这里c为false(0)
int e = 3;
bool f = !e;       //这里f为false(0)
3. <<(位左移)、>>(位右移)
        位左或右移几把整个数的二进制形式向左或右移动固定的位数,同时该数的右或左将用0补充。同样地,>>=与<<=也存在,含义类推,例如下面的代码:
#include <iostream>
using namespace std;
int main(){
    int a = 3;              //二进制表示0000 0000 0000 0011
    int b = a << 2;         //这里a向左移2位后即为 0000 0000 0000 1100 -> 12
    int c = a >> 1;         //这里a向右移1位后即为0000 0000 0000 0001 -> 1
    cout << b << "  " << c; //输出结果为12和1
    return 0;
}

下面就可以写一些简单的与逻辑有关的程序了;
例:写一个程序,要求能够提取某一数的第五位,清空某一数的第五位以及将某一数的第五位置为1(例如:24提取第五位 -> 0,62清空第五位 -> 30,24第五位置1 -> 56)。以下为代码:

#include <iostream>
using namespace std;
int main(){
    int a = 24;
    int b = 62;
    int c = a & 0x20;   //0x20为十六进制,二进制为0010 0000,只有第五位为1,与a作与运算后c为0000 0000;
    c >>= 5;             //c向右移5位即把第五位提取出来了
    cout << c;          //输出为0
    int d = b & 0xffdf; //0xffdf只有第5位为0,即把第五位清空了
    cout << d;          //输出结果为30
    int e = a | 0x20;   //第五位为1作或运算后即将a的第五位置1了
    cout << e;          //输出为56
    return 0;
}

如有错误,欢迎大家批评与指正!

猜你喜欢

转载自blog.csdn.net/WJ_SHI/article/details/81460935