2008년 1학기 시스템 프로그래밍 과제

 

1. Reverse bits

Write a C program to read in a number (in hexadecimal), reverse the bit order,

and print out the result (in hex).

For example, an input of 123456AB would give D56A2C48.

Your program should handle any number representable

as a 32-bit unsigned number.

If there are less than 8 hex-digits in the input, you should pad it with 0’s.

 

 

코드

/*
*     Reverse_bits (Reverse bits)
*
*     This function reverse the number by bit. (e.g. 0101 -> 1010)
*
*     - Argument
*     input_number : user input number
*
*     - Return
*     void
*
*
*     First, get the number by argument.
*     set the return variable zero because If there are less than 8 hex-digits in the input, then I pad it with 0.
*
*     & operator is bit-level AND operation.
*     | operator is bit-level OR operation.
*
*     number & 0x01 -> all 0 except number's least significant bit. (e.g. 1010 0101 & 0x01 -> 0000 0001)
*     So I take the number's least significant bit.
*
*     Then put it result_value variable.
*     0 | 0 = 0, 1 | 0 = 1, 0 | 1 = 1
*     So number's least significant bit is 1, then all same except set 1 in result_value least significant bit. (e.g. 0101 1010 | 0000 0001 -> 0101 1011)
*     or number's least significant bit is 0, then all same except set 0 in result_value least significant bit. (e.g. 0101 1010 | 0000 0000 -> 0101 1010)
*
*     first do it and looping because and/or operation do bit size(e.g. 32) but shift operation must do bit size - 1.
*     input_number do right shift 1. Therefore I use next bit.
*     and result_value do left shift to write next bit.
*     go to the first for loop until bit size - 1.
*
*     Finally print the result.
*
*
*     example 1011 -> 1101
*     code                                    input_number    result_value
*     first                                   1011            0000
*     result_value |= (input_number & 0x01);  1011            0001
*     input_number = input_number >> 1;       0101            0001
*     result_value = result_value << 1;       0101            0010
*     result_value |= (input_number & 0x01);  0101            0011
*     input_number = input_number >> 1;       0010            0011
*     result_value = result_value << 1;       0010            0110
*     result_value |= (input_number & 0x01);  0010            0110
*     input_number = input_number >> 1;       0001            0110
*     result_value = result_value << 1;       0001            1100
*     result_value |= (input_number & 0x01);  0001            1101
*
*
*     Made by Bak JinYeong, 2008.03.13
*     Edited by Bak JinYeong, 2008.03.14*/
void Reverse_bits(unsigned int input_number)
{
    unsigned int result_value = 0; // unsigned int variable use result value. It intialize 0.
    int for_loop_i = 0; // integer variable use loop for loop sentence

    result_value |= (input_number & 0x01); // take input_number's least significant bit and set into result_value's least significant bit.
    for(for_loop_i = 1 ; for_loop_i < BUS_SIZE_BIT ; for_loop_i++) // loop bus size bit - 1
    {
        input_number = input_number >> 1; // input_number do right shift 1
        result_value = result_value << 1; // result_value do left shift 1
        result_value |= (input_number & 0x01); // take input_number's least significant bit and set into result_value's least significant bit.
    }

    printf("Reverse bits : 0x%x\n", result_value); // print result by %x
}

크리에이티브 커먼즈 라이센스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1453

댓글을 달아 주세요

[로그인][오픈아이디란?]