当 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
我正在尝试编写一个 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