位运算

91 阅读2分钟
//
// Created by someb on 2024/2/2.
//测试位运算符的使用
/*
 * <<   >>  &   |   ^(异或)   ~
 *
 * 1.位运算符针对的是整型数值做的运算
 * 2.位运算比四则运算速度快
 *
 * 高效的方式计算2 * 8 的值(经典面试题)
 * answer:2 << 3 或 8<<1
 */

#include<stdio.h>

int main(){
    int m1 = 3;
    printf("%d\n",m1 << 1);

    printf("9 & 7 = %d\n",9 & 7);
    printf("9 | 7 = %d\n",9 | 7);
    printf("~9 = %d\n",~9);
    printf("~-10 = %d\n",~-10);

    /*
     * 练习:特定位清零
     * 示例:设字符型x的当前值为53,将其最低俩位清0,其余位保持不变
     * 分析:与二进制的0b11111100数值求&运算即可
     */
    char x1 = 53;    //0b00110101
    x1 = x1 & 0b11111100;
    printf("%d\n",x1);


    /*
     * 举例:判断特定位是否为0
     * 技巧:待判定位与1,其它位为0,判与运算结果是否为0
     * 示例:设字符型x的当前值为53,判定其最高位是否为0
     * 分析:与二进制的0b10000000求&运算,若结果为0,则最高位为0,否则为1
     */
    char x2 = 53;
    x2 = x2 & 0b10000000;
    if(x2 == 0)
        printf("最高位为0\n");
    else
        printf("最高位为1\n");

    /*
     * 举例:保留特定位
     * 技巧:待保留位全部与1,其余位为0
     * 示例:设字符型x的当前值为53,保留其低4位,其余位清零
     * 分析:与二进制的0b00001111求&运算即可
     */
    char x3 = 53;
    x3 = x3 & 0b00001111;
    printf("%d\n",x3);

    /*
     * 举例:待置 1 或 1 ,保持位为0
     * 示例:设字符型x的当前值为53,将其最低俩位置1,其余位保持不变
     * 分析:与二进制0b00000011求或运算
     */
    char x4 = 53;
    x4 = x4 | 0b00000011;
    printf("%d\n",x4);

    /*
     * 举例:特定位取反
     * 待取反位异或1,保持位异或0
     * 示例:设字符x的当前值为53,将其最低俩位取反,其余位保持不变
     * 分析:与二进制0b00000011求异或运算
     */
    int x5 = 53;
    x5 = x5 ^0b00000011;
    printf("%d\n",x5);
    return 0;
}

执行结果

6
9 & 7 = 1
9 | 7 = 15
~9 = -10
~-10 = 9
52
最高位为0
5
55
54

Process finished with exit code 0