知识杂货铺

不卖切糕

View on GitHub
11 April 2019 00:00

《王道程序员求职宝典》笔记 - 第4章 运算符及其优先级

by 宋强

短路求值 在逻辑表达式中,只有左边的逻辑表达式不能够确定结果时才会执行右边的逻辑表达式,这个行为叫做逻辑表达式的短路求值。

判断一个数是否为2的正整数次幂

if (n > 1 && ((n & (n-1)) == 0)) {
        return true;
}

异或运算符

异或运算符满足交换律 利用这个特性和两个相同的数异或为0的特性可用于寻找成对出现的数中缺失的数。$P_{69}$

异或运算符可用于不使用中间值而交换两个变量的值

void swap(int &a, int &b)
{
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
}

异或运算符可用于不使用运算符实现加法

int add(int a, int b)
{
        if (b == 0) {
                return a;
        }

        int sum = a ^ b;
        int carry = (a & b) << 1;
        return add(sum, carry);
}

异或运算符求两个数平均值

int mean(int a, int b)
{
        return (a & b) + ((a ^ b) >> 1);
}

使用与运算符去掉最低位的1

int reset_lowest(int a) { return (a &= (a - 1)); }

测量1的数量

int count_ones(int a)
{
        int count = 0;
        while (a > 0) {
                a &= (a - 1);
                count++;
        }

        return count;
}

将一个表达范围小的变量赋给表达范围大的变量会扩展符号位

例如:

char a = 0xe0;
int b = a; //此时b为0xffffffe0;

表达式中同时含有int和unsigned int int会被转换成unsigned int。

运算符优先级简单规则

  1. 四个运算符’()’,’[]’,’->’,’.(取成员符)’优先级最高。
  2. 单目运算符比双目运算符优先级高,双目运算符中算数双目运算符优先级最高。
  3. 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 三目运算符’?:’。
  4. 赋值运算符仅比逗号运算符优先级高,所有赋值运算符优先级相同, 从右向左结合。

使用if判断一个float型变量或者double型变量是否为0

不可以使用if(x == 0)。

判断一个float型变量是否为零需要使用:

if (fabs(x) < 0.000001) {
        return true;
}
if (x < 0.000001 && x > -0.000001) {
        return true;
}

这个主要是由于float可以表达小数点后6位。(并且因为精度丢失导致?) 由于double能够表达小数点后9位,所以如果检测的是double类型的话需要将上述两个表达式里的0.000001换成0.000000001。

习题

待补充。

tags: c++ - 笔试 - 笔记