当 MSB 和 LSB 相同时,C 中的位选择不起作用

bit selection in C not working when MSB and LSB are the same

我正在尝试编写一个 select 函数 returns 给定数字的起始位和结束位之间的位(包括),但是我的程序在以下情况下不起作用起始位和结束位是相同的值。我做错了什么?

int bit_select(int num, int start, int end) {
        int s = 8*sizeof(int)-1;
        if (start != s) {
                start++;
        }
        unsigned int shifted = num << ((s+1) - start);
        
        return shifted;
}

这是我从头开始创建的算法,基于 [你和我的] 最热门评论以及一个简单的诊断套件:

#include <stdio.h>

typedef unsigned int num_t;

#define DOTEST(_fnc) \
    do { \
        res = _fnc(val,beg,end); \
        printf(" %s=%8.8X",#_fnc,res); \
    } while (0)

num_t
craig(num_t val,int beg,int end)
{
    num_t msk = 1;
    num_t res;

    res = val;

    msk <<= (beg + 1);
    msk -= 1;
    if (msk != 0)
        res &= msk;

    res >>= end;

#if 0
    printf("craig: val=%8.8X msk=%8.8X res=%8.8X beg=%d end=%d\n",
        val,msk,res,beg,end);
#endif

    return res;
}

int
molly(int num, int start, int end)
{
    int s = 8 * sizeof(int) - 1;

    if (start != s) {
        start++;
    }
    unsigned int shifted = num << ((s + 1) - start);

    shifted = shifted >> ((s + 1) - start + end);

    return shifted;
}

int
molly2(unsigned int num, int start, int end)
{
    int s = 8 * sizeof(int) - 1;

    if (start != s) {
        start++;
    }
    unsigned int shifted = num << ((s + 1) - start);

    shifted = shifted >> ((s + 1) - start + end);

    return shifted;
}

void
dotest(num_t val,int beg,int end)
{
    num_t res;

    printf("dotest: %8.8X",val);
    DOTEST(craig);
    DOTEST(molly);
    DOTEST(molly2);
    printf(" %d/%d\n",beg,end);
}

int
main(void)
{

    dotest(0xe7e7,3,3);
    dotest(0xe7e7,7,4);
    dotest(0xe7e7,7,5);
    dotest(0xFFFFFFFF,31,31);

    return 0;
}

程序输出如下:

dotest: 0000E7E7 craig=00000000 molly=00000000 molly2=00000000 3/3
dotest: 0000E7E7 craig=0000000E molly=0000000E molly2=0000000E 7/4
dotest: 0000E7E7 craig=00000007 molly=00000007 molly2=00000007 7/5
dotest: FFFFFFFF craig=00000001 molly=FFFFFFFE molly2=FFFFFFFE 31/31