位运算(了解)

本篇文章仅作为了解

位运算

  • & 按位与
  • | 按位或
  • ^ 按位异或
  • ~ 取反
  • << 左移
  • >> 右移
按位与 &
  • 一假则假,1真 0假
    9 & 5 =
    1001
   &0101
   -------
    0001 = 1
按位或 |
  • 一真则真
    9 | 5 =
    1001
   &0101
   -----
    1101  = 13
按位异或 ^
  • 不相同为1,相同为0
    9 ^ 5 =
    1001
   |0101
   -----
    1100  = 12
  • 异或的结果和参与运算的顺序没有关系
  • 相同的两个数异或 等于0
  • 任何一个数异或0的结果还是这个数
  • 任何一个数异或同一个数两次,结果不变
取反
  • 是单目运算符,作用是对参与运算的二进制位取反,~1 = 0 , ~0 = 1
  • 取反运算时对参与运算的数的在内存中存储的补码进行取反
  • 想得到真实的值,就需要对取反后的值进行还原
  • 先转换成反码,然后转换成原码
左移
  • 左移就是将操作数各个二进制位全部左移若干位,高位丢弃,低位补0
  • 如果数据较小,被丢弃的高位不包含1,那么左移n位相当于乘以2的n次方
  • 左移有可能改变一个数得正负性
右移
  • 右移和左移相反
  • 右移就是将操作数的各个二进制位全部右移若干位,低位丢弃,高位补0或1,如果最高位是0补0,是1补1
  • 如果被丢弃的低位不包含1,那么右移n位相当于除以2的n次方
左移和右移的应用场景,如果想让某一个数乘以2的n次方,或者除以2的n次方,最高效的方法就是左移右移
输出整数的二进制
/**
 让value的二进制位向右移31,就可以获得到value的最高位的二进制,然后让value德二进制的最高位和1相&,就可以获得value的最高位
 其他位置上的以此类推
 此方法输出的是补码,如果是负数,那么还需要转换成原码
 */
void printBinay(int value)
{
    //1.定义变量需要向右移动的位数
    int offset = 31;
    //2.通过循环取出每一位数
    while (offset >= 0) {
        int result = (value >> offset) & 1;
        printf("%i", result);
        offset--;
        if((offset + 1) %4 == 0){
            printf(" ");
        }
    }
}
判断一个数的奇偶性
    if((num & 1) == 1){
        printf("奇数\n");
    }else{
        printf("偶数\n");
    }
交换两个变量的值
  • 第一种方式
int temp = a;
a = b;
b = temp;
  • 第二种方式
a = a + b;
b = a - b;
a = a - b;
  • 第三种方式
a = a ^ b;
b = a ^ b;
a = a ^ b;

你可能感兴趣的:(位运算(了解))