• 宏定义完成位运算的几个题


    用宏置位、复位。

     1 // 把x的第n位置一
     2     #define SET_NTH_BIT(x, n)  (x | ((1U)<<(n-1)))
     3     
     4 //把x的第n位清零
     5     #define CLEAR_NTH_BIT(x, n) (x & ~((1U)<<(n-1)))
     6     
     7 //把x的n-m位置一
     8      #define SET_BIT_N_M(x,n,m)  (x|((~((~0U)<<(m-n+1)))<<(n-1)))
     9 
    10 //把x的n-m位读取出来
    11     #define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)) 

    1.使用宏定义将32位数x的第n位置一(右边第一位,第n位代表bitn-1,比如,第一位就是bit0)

    分析:
    第一步:置一使用位或 |
    第二步:第n位置一,先在最低位构建1,然后左移n-1位
    第三步:构建的特定数与原来的x位或

     1 #include<stdio.h>
     2 
     3 #define SET_BIT_N(x,n)  (x | (1U<<(n-1)))
     4 
     5 int main(void)
     6 {
     7     unsigned int x = 0;        //x的初始值
     8     unsigned int b = 0;
     9     b = SET_BIT_N(x,4);        //宏得到的结果赋值给b
    10     printf("b = 0x%x
    ",b); // b = 0x8 二进制数0000 1000
    11     
    12 }

    2.使用宏定义将32位数x的第n位清零(右边第一位,第n位代表bit n-1)

    分析:
    第一步:清零用位与
    第二步:第n位清零,第n位是0,其他位是1,1多0少使用位取反
    第三步:构建的特定数与原来的x位与

     1 #include<stdio.h>
     2 
     3 #define CLEAR_BIT_N(x,n)  (x & ~(1U<<(n-1)))
     4 
     5 int main(void)
     6 {
     7     unsigned int x = 0xff;    //x的初始值
     8     unsigned int b = 0;
     9     b = CLEAR_BIT_N(x,4);    //宏得到的结果赋值给b
    10     printf("b = 0x%x
    ",b);  // b = 0xf7  1111 1011
    11     
    12 }

    3.使用宏定义将32位数x的第n位到第m位置一(n是低位,m是高位)比如 n = 3,m =6

    分析:
    第一步:置一用位或
    第二步:bit n - bit m一共有 (m-n+1)个位
    第三步:左移(m-n+1)位之后,得到了(m-n+1)个0,要再取反
    第四步:左移n-1位

     1 #include<stdio.h>
     2 
     3 #define SET_BIT_N_M(x,n,m)  (x|((~((~0U)<<(m-n+1)))<<(n-1)))
     4 
     5 int main(void)
     6 {
     7     unsigned int x = 0;
     8     unsigned int b = 0;
     9     b = SET_BIT_N_M(x,1,4);  
    10 //    b = SET_BIT_N_M(x,5,8);     // 第5-8位置一,b = 0xf0
    11     printf("b = 0x%x
    ",b);        //第1-4位置一,b = 0xf
    12 }

    4.截取变量的部分连续位。例如:变量0x88,也就是10001000b,若截取第2~4位,则值为:100b = 4

    #define GETBITS(x, n, m) ((x & ((0U)<<(m-n+1))<<(n-1)) >> (n-1))
    分析:
    第一步:保留第2位-第4位,也就是bit1-bit3

    第二步:得到一个特定数bit1-bit3为1,其他位是0,与原来的数进行位或

     1  ~(0U) // 32位1
     2 ~(0U)<<(m-n+1) //得到(m-n+1)个1(最低位开始)
     3 
     4 ((0U)<<(m-n+1)) //得到(m-n+1)个0(最低位开始)
     5 
     6 ((0U)<<(m-n+1))<<(n-1) //得到bit(n-1)-bit(m-1)是0
     7 
     8 (x & ((0U)<<(m-n+1))<<(n-1)) //和原来的数进行位与
     9 
    10 ((x & ((0U)<<(m-n+1))<<(n-1)) >> (n-1)) //移位到最低位进行读取
    11  

    第三步:将位或之后的数右移到最低位,读出

     1 #include<stdio.h>
     2 
     3 #define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))
     4 
     5 int main(void)
     6 {
     7 unsigned int x = 0x88;    //1000 1000
     8 unsigned int b = 0;
     9 b = GETBITS(x,2,4);
    10 printf("b = 0x%x
    ",b);    //b = 0x4
    11 
    12 }

     

  • 相关阅读:
    http://www.17sucai.com/
    vs2010 开发过程中调试时 有错误不中断
    dev 激活没有权限问题
    华为设备板卡类别
    CentOS6.8安装python2.7以及XX-Net
    PHP之封装一些常用的工具类函数
    PHP环境配置
    Ajax接收不到PHP return后的结果的原因
    PHP实现删除数组中的特定元素
    PHP用单例模式实现一个数据库类
  • 原文地址:https://www.cnblogs.com/1024E/p/13204487.html
Copyright © 2020-2023  润新知