C/C++技巧

1. 三目运算符

语法:表达式1 ? 表达式2 : 表达式3表达式1为真则执行表达式2,否则执行表达式3。相比if语句,三目运算符短小简洁,适当使用可以提高代码可读性。

另外,如果三目运算符返回左值,可以继续赋值。

举例

#include <iostream>
using namespace std;

int main ()
{
    system("chcp 65001"); // 避免终端显示中文乱码

    int num1 = 10;
    int num2 = 20;
    int max = 0;

    cout << "原始num1=" << num1 << " num2=" << num2 << endl;
    max = num1 > num2 ? num1 : num2;
    cout << "较大数值:" << max << endl;
    num1 > num2 ? num1 : num2 = 100; // 左值支持赋值
    cout << "重新赋值后num1=" << num1 << " num2=" << num2 << endl;

    return 0;
}

2. 位运算

计算机中的数在内存中均以二进制形式存储,而位运算直接操作内存二进制位,因此执行效率非常高。

2.1 常用位运算

以下num表示十进制下的整数

  • 获取第i位的数字:(num >> i) & 1
  • 置位第i位:num |= (1 << i)
  • 清零第i位:num &= ~(1 << i)
  • 把第i位取反:num ^= (1 << i)

2.2 使用举例

位运算可以把状态压缩到一个二进制数中,每个bit表示一种状态。常用的位运算操作可以方便控制每个bit的状态,优化程序。

比如可以使用一个uint8_t来表示最多8个判断状态,根据对应的bit位执行相应的操作,比使用一堆bool要优雅很多。

#include <iostream>

void checkStatus(uint8_t checkFlag)
{
    if (1 & (checkFlag >> 0))
    {
        std::cout << "bit0为1,执行对应操作" << std::endl;
    }
    else
    {
        std::cout << "bit0为0,执行对应操作" << std::endl;
    }

    if (1 & (checkFlag >> 1))
    {
        std::cout << "bit1为1,执行对应操作" << std::endl;
    }
    else
    {
        std::cout << "bit1为0,执行对应操作" << std::endl;
    }

    if (1 & (checkFlag >> 2))
    {
        std::cout << "bit2为1,执行对应操作" << std::endl;
    }
    else
    {
        std::cout << "bit2为0,执行对应操作" << std::endl;
    }

    if (1 & (checkFlag >> 3))
    {
        std::cout << "bit3为1,执行对应操作" << std::endl;
    }
    else
    {
        std::cout << "bit3为0,执行对应操作" << std::endl;
    }
}

int main()
{
    system("chcp 65001"); // 避免终端显示中文乱码
    uint8_t checkFlag = 0b0011;

    checkStatus(checkFlag);
    return 0;
}

3 数值的表示

不同的数值表示可以让程序更清晰明了,比如位运算常用二进制、十六进制;对无符号、长整型、浮点数用后缀表示更清晰。

#include <iostream>

int main()
{
    int num1 = 0xa0;
    int num2 = 0b1010;
    int num3 = 023;
    float num4 = 12.f;
    unsigned int num5 = 13u;
    long int num6 = 14l;
    double num7 = 1.2e3;

    printf("num1: 0x%x\n", num1);
    printf("num2: 0x%x\n", num2);
    printf("num3: 0%o\n", num3);
    printf("num4: %.3f\n", num4);
    printf("num5: %u\n", num5);
    printf("num6: %ld\n", num6);
    printf("num7: %.3f\n", num7);

    return 0;
}
posted @ 2024-05-18 15:02  wangxinzhi  阅读(45)  评论(0)    收藏  举报