C reverse bits in unsigned integer

前端 未结 12 860
一整个雨季
一整个雨季 2020-11-30 10:18

I\'m converting an unsigned integer to binary using bitwise operators, and currently do integer & 1 to check if bit is 1 or 0 and output, then right shift by 1 to divide

12条回答
  •  温柔的废话
    2020-11-30 10:58

    I believe the question is asking how to not output in reverse order.

    Fun answer (recursion):

    #include 
    
    void print_bits_r(unsigned int x){
        if(x==0){
           printf("0");
           return;
        }
        unsigned int n=x>>1;
        if(n!=0){
           print_bits_r(n);
        }
        if(x&1){
            printf("1");
        }else{
            printf("0");
        }
    }
    
    
    void print_bits(unsigned int x){
        printf("%u=",x);
        print_bits_r(x);
        printf("\n");
    }
    
    int main(void) {
        print_bits(10u);//1010
        print_bits((1<<5)+(1<<4)+1);//110001
        print_bits(498598u);//1111001101110100110
        return 0;
    }
    

    Expected output:

    10=1010
    49=110001
    498598=1111001101110100110
    

    Sequential version (picks off the high-bits first):

    #include //Defines CHAR_BIT
    //....
    void print_bits_r(unsigned int x){
        //unsigned int mask=(UINT_MAX>>1)+1u;//Also works...
        unsigned int mask=1u<<(CHAR_BIT*sizeof(unsigned int)-1u);
        int start=0;
        while(mask!=0){
            if((x&mask)!=0){
                printf("1");
                start=1;
            }else{
                if(start){
                    printf("0");
                }
            }
            mask>>=1;
        }
        if(!start){
           printf("0");
        }    
    }
    

提交回复
热议问题