How to extract specific bits from a number in C?

后端 未结 8 1224
遥遥无期
遥遥无期 2020-12-08 07:35

I need to extract specific part (no of bits) of a short data type in C.

For Example I have a binary of 52504 as 11001101000 11000 and I want First 6 (

相关标签:
8条回答
  • 2020-12-08 08:15
    unsigned int extract_n2mbits(unsigned int x, int n, int m)
    {
    unsigned int mask, tmp;
    if (n < m) {
        n = n + m;
        m = n - m;
        n = n - m;
    }
    mask = 1 << (n - m + 1);
    tmp = m;
    while (tmp > 1) {
        mask = mask << 1 | 1 << (n - m + 1);
        tmp = tmp - 1;
    }
    return ((x & mask) >> (n - m + 1));
    }
    
    0 讨论(0)
  • 2020-12-08 08:18
    //To get value from specific position 'pos' to 'pos+offset' in number 'value'
    
    #define bitGet(value, offset, pos) (((1ull << offset) - 1) & (value >> (pos - 1)))
    
    //Set value 'newval' from position 'pos' to 'pos+offset' in number 'value'
    
    #define bitSet(value, offset, pos, newval)  \
    (~(((1ull << offset) - 1) << (pos - 1)) & value) | ((((1ull << offset) - 1) & newval) << (pos - 1))
    
    0 讨论(0)
  • 2020-12-08 08:19
    void  f(short int last, short int first, short int myNr){
          //construct mask for last bits
          short int mask=0;
          for(int i=0;i<last;i++)
           { mask+=1;
            mask<<1;}
          short int aux= myNr;
          aux=aux&mask; // only last bits are left
          //construct mask for first bits
          mask=0;
          for(int i=0;i<first;i++)
           { mask+=0x8000h;
            mask>>1;} 
          aux=myNr;  
          aux&=mask;
          aux>>last; // only first bits are left and shifted
    }
    

    you can add parameters to get the values out or something

    0 讨论(0)
  • 2020-12-08 08:21
    unsigned short extract(unsigned short value, int begin, int end)
    {
        unsigned short mask = (1 << (end - begin)) - 1;
        return (value >> begin) & mask;
    }
    

    Note that [begin, end) is a half open interval.

    0 讨论(0)
  • 2020-12-08 08:23

    Although its a very old question, I would like to add a different solution. Using macros,

    /* Here, startBit : start bit position(count from LSB) endBit : end bit position(count from LSB) .NOTE: endBit>startBit number : the number from which to extract bits maxLength:the total bit size of number. */ `

    #include <stdio.h>
    #define getnbits(startBit,endBit,number,maxLength) \
      ( number &  ( (~0U >> (maxLength-endBit)) & (~0U << startBit) )  ) 
    
    int main()
    {
        unsigned int num=255;
        unsigned int start=1,end=5,size=sizeof(num)*8;
    
        printf("Inputs : %d %d %d %d \n ",start,end,num,size);
        printf("Input number : %d\n",num);
    
        if(end>start)
        {
            int result = getnbits(start,end,num,size-1);
            printf("Output : %u\n\n",result);
        }
        else
            printf("Error : EndBit is smaller than starBit!\n\n");
    
        return 0;
    }
    

    `

    Output : Inputs : 1 5 255 32
    Input number : 255
    Output : 62

    Here, 255 = 11111111 and 62 = 00111110

    0 讨论(0)
  • 2020-12-08 08:26
    // This is the main project file for VC++ application project 
    // generated using an Application Wizard.
    
    #include "stdafx.h"
    
    #using <mscorlib.dll>
    
    using namespace System;
    
    
    void fun2(int *parr)
    {
        printf(" size of array is %d\n",sizeof(parr));
    }
    void fun1(void)
    {
        int arr[100];
        printf(" size of array is %d\n",sizeof(arr));
        fun2(arr);
    }
    
    int extractBit(int byte, int pos) 
    {
        if( !((pos >= 0) && (pos < 16)) )
        {
            return 0;
        }
        return ( ( byte & (1<<pos) ) >> pos);
    }
    int extractBitRange(int byte, int startingPos, int offset) 
    {
    
    
       if(  !(((startingPos + offset) >= 0) && ( (startingPos + offset) < 16)) )
       {
            return 0;
       }
       return ( byte >> startingPos ) & ~(0xff << (offset + 1));
    }
    
    int _tmain()
    {
        // TODO: Please replace the sample code below with your own.
    
        int value;
        signed int res,bit;
        signed int stPos, len;
        value = 0x1155;
        printf("%x\n",value);
        //Console::WriteLine("Hello World");
        //fun1();
        for(bit=15;bit>=0;bit--)
        {
            res =extractBit(value,bit);
            printf("%d",res);
        }
        stPos = 4;
        len = 5;
        res = extractBitRange(value, stPos, len);
        printf("\n%x",res);
    
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题