2021-04-19C/C++学习00
请注意,本文编写于 589 天前,最后修改于 589 天前,其中某些信息可能已经过时。

目录


位运算

  • 程序中的所有数在计算机内存中都是以二进制的形式存储。位运算就是直接对在内存中的二进制位进行操作。
  • 按位与逻辑& 相同位的两个数字都为1,则为1。
  • 按位或逻辑| 相同位只要一个位1即为1。
  • 按位异或逻辑^ 相同位不同则为1,否则为0
  • 按位取反逻辑~
  • 左移<< 正整数 *2
  • 右移>> 正整数 /2

恒等式

c
A and 0 = 0
A and 1 = A
A or 0 = A
A or 1 = 1;

A xor 0 = A
A xor 1 = not A

A and not A = 0
A or not A = 1

A xor B = C
C xor A = B
C xor B = A

异或交换变量的值

c
int main()
{
    int n = 8;
    int m = 20;

    n = n^m;
    m = n^m;
    n = n^m;

    system("pause");
    return(0);
}

异或用途

  1. 交换两数
  2. 备份数据
  3. 取反。
  4. 清零

C语言中的位移都是算术位移,算术左移同逻辑左移一样都是高位丢弃,低位补0。

算术右移无符号数同逻辑右移一样低位丢弃,高位补0;但如果算术右移一个有符号数,那么它将低位丢弃,高位补符号位(也就是右移负数时,算术右移与逻辑右移的结果会不同)。

算术左移等同于乘以2的幂,算术右移正数时等于除以2的幂,当右移一个负数时,想得到正确结果先要加上2的幂-1再右移,否则当右移不能整除时,不会得到正确的结果。

位运算求绝对值

c

int my_abs(int n)
{
    //if n < 0 then m = 0xffffffff;else m = 0;
    int m = n >> 31;

    //if n < 0 then n ^-1 = ~n; else n ^ 0 = n;
    n = n ^ m;

    //if n < 0 then n ~n - -1 = ~n + 1 = neg;
    n = n - m;
    return n;
}

本文作者:Na1r

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!