zoukankan      html  css  js  c++  java
  • 宏定义完成位运算的几个题

    用宏置位、复位。

     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 }

     

  • 相关阅读:
    Python中的类(上)
    Django REST Framework API Guide 07
    Django REST Framework API Guide 06
    Django REST Framework API Guide 05
    Django REST Framework API Guide 04
    Django REST Framework API Guide 03
    Django REST Framework API Guide 02
    Django REST Framework API Guide 01
    Django 详解 信号Signal
    Django 详解 中间件Middleware
  • 原文地址:https://www.cnblogs.com/1024E/p/13204487.html
Copyright © 2011-2022 走看看