【问题标题】:Given a 16-bit integer, compare each of the four bits and output the maximum one给定一个 16 位整数,比较四位中的每一位并输出最大值
【发布时间】:2011-12-03 00:55:23
【问题描述】:

。例如0xFE10,应该输出0xF(二进制1111)。

这是一道高通面试题。到目前为止,这是我的想法:

我调用的是 16 位整数:

int num = /*whatever the number is*/

有四个位掩码:

int zeroTo4 = (num & 0x000F);  
int fiveTo5 = (num & 0x00F0) >> 4;   
int eightTo12 = (num & 0x0F00) >> 8;   
int twelveTo16 = (num & 0xF000) >> 12;   

int printbit = zeroTo4;

if( fiveTo5 > printbit )
    printbit = fiveTo5;

if( eightTo12 > printbit )
    printbit = eightTo12;

if( twelveTo16 > printbit )
    printbit = twelveTo16;

printf( "Largest bit of %X is %1X\n", num, printbit );

但是,我很确定有一种更简单的方法可以做到这一点。谁能帮我吗?谢谢!

【问题讨论】:

    标签: binary hex bit-manipulation bit-shift


    【解决方案1】:
    int max4(int j)
    {
       int ret=0;
       while(j>0)
       {
            if( (j&0xf) > ret ) ret=j&0xf;
            j>>=4;
       }
       return ret;
    }
    

    有些人可能更喜欢:

    int max4(int j)
    {
       int ret=0;
       do if( (j&0xf) > ret ) ret=j&0xf;
       while((j>>=4)>0);
       return ret;
    }
    

    【讨论】:

    • 由于int是有符号数量,如果j < 0会失败。
    • 不能通过将 while 条件从 j > 0 更改为 while( j != 0 ) 来解决这种极端情况吗?
    • @lordmarinara:不一定,因为右移有符号数量会符号扩展,这意味着重复这样做永远不会达到零。
    • 我想我可以做相反的逻辑:int ret = 0; while( j != 0 ) { if( (j & 0xF000) > ret ) ret = j & 0xF000; j <<= 4; } return ( ret >> 12 ) & 0x000F; 如果我没记错的话,一个左屎在移位时不会保留符号位。
    • 给定输入是一个 16 位整数。所以用 32 位表示时不能小于零。
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2014-02-14
    • 2012-12-06
    相关资源
    最近更新 更多