1. 程式人生 > >寫一段函式,計算無符號32位整數從高到低,第一個‘1’的位置。(例如,0x0F000000的第一個‘1’的位置為5)

寫一段函式,計算無符號32位整數從高到低,第一個‘1’的位置。(例如,0x0F000000的第一個‘1’的位置為5)

使用2分查詢的方法解決,從左到右查詢“1”的位置。

#include <stdio.h>

int func(unsigned int data)
{
    int pos = 1;       //用於計數,計錄第一個“1”的位置

    if((data & 0xffff0000) == 0)  //如果data與高16位相與後為零,表示data高16位中不含有“1”
    {
        data <<= 16;   //將data左移16位,去除高16位
        pos += 16;     //pos加16,表示前16位中不含有數字“1”
    }

    if((data & 0xFF000000) == 0)
    {
        data <<= 8;
        pos += 8;
    }

    if((data & 0xF0000000) == 0)
    {
        data <<= 4;
        pos += 4;
    }

    if((data & 0xC0000000) == 0)
    {
        data <<= 2;
        pos += 2;
    }

    if((data & 0x80000000) == 0)
    {
        data <<= 1;
        pos += 1;
    }

    return pos;
}


int main(void)      //測試程式碼
{
    printf("the pos =%d.\n",func(0xffffffff));
    printf("the pos =%d.\n",func(0x00000001));
    return 0;
}