• C语言学习笔记_位运算


    C语言学习笔记_位运算

    知识点记录

    基本位运算

    按位与:全1为1,见0为0;与1相与无变化,与0相与变为0;可用于特定位清零

    按位或:见1为1,全0为0;与1相或变为1,与0相或无变化;可用于特定位置1

    异或:相同为0,不同为1;与1异或会取反,与0异或无变化;可用于特定位取反

    移位运算

    无符号数:左移右侧补0,右移左侧补0

    有符号数:左移右侧补0,右移左侧补符号位

    构造特定二进制数

    unsigned int a, b;
    a = (0x1<<3);				//构造二进制数0000 …… 0000 1000
    b = (0x1<<3) | (0x1<<6);	//构造二进制数0000 …… 0100 1000
    
    unsigned int c,d;
    c = ~(0x1<<3);				//构造二进制数1111 …… 1111 0111
    d = ~((0x1<<3) | (0x1)<<6);	//构造二进制数1111 …… 1011 0111
    

    测试

    给定一个整形数a,设置a的bit3~bit7,保持其他位不变。

    a |= 0x1F<<3;

    给定一个整形数a,清除a的bit15~bit23,保持其他位不变。

    a &= ~(0x1FF<<15);

    给定一个整形数a,取出a的bit3~bit8。

    a = (a>>3) & 0x3F;

    给一个寄存器的bit7~bit17中的值加17

    unsigned int b;				//定义临时变量
    b = (a>>7) & 0x7FF;			//获取bit7~bit17中的值
    b += 17;					//对原来的值增加17
    a &= ~(0x7FF<<7);			//对应位清零
    a |= b<<7 ;					//对应位赋值
    

    给一个寄存器的bit7-bit17赋值937,同时给bit21-bit25赋值17。

    a &= ~((0x7FF<<7) | (0x1F<<21));		//对应位清零
    a |= (937<<7) | (17<<21);				//对应位赋值
    

    用宏定义将32位数x的第n位置位

    #define SET_BIT_N(x, n) (x | (1U<<(n-1))) //数字后面加U表示无符号

    用宏定义将32位数x的第n位清零

    #define CLEAR_BIT_N(x, n) (x & ~(1U<<(n-1)))

    用宏定义将32位数x的第n位到第m位置位

    #define GET_ALLONE_BITS(n, m)	(~(~(0U)<<(m-n+1)))			//得到m-n+1位全为1的二进制数
    #define SET_BIT_N_M(x, n, m)	(x | GET_ALLONE_BITS(n, m)<<(n-1))		//置位
    

    截取变量x的第n到第m位

    #define GET_BIT(x, n, m) (x>>(n-1) & GET_ALLONE_BITS(n , m))

  • 相关阅读:
    hdu 1875 畅通project再续(kruskal算法计算最小生成树)
    Http post提交和get提交
    我的软考之路(五)——数据结构与算法(3)之图
    WPF 布局控件 之 DockPanel
    oracle存储结构
    马化腾最想做的事情是人工智能
    Android_Zip解压缩工具
    Unity的 Stats 窗体, Batched、SetPass、Draw Call 等
    尝试 “实验楼”在线教育平台
    POJ 3181 Dollar Dayz 01全然背包问题
  • 原文地址:https://www.cnblogs.com/sakurapiggy/p/13021168.html
Copyright © 2020-2023  润新知