如何解决当 MSB 和 LSB 相同时,C 中的位选择不起作用
我正在尝试编写一个位选择函数,该函数返回给定数字(包括)的起始位和结束位之间的位,但是当起始位和结束位是相同的值时,我的程序不起作用。我做错了什么?
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,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 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 end)
{
num_t res;
printf("dotest: %8.8X",val);
DOTEST(craig);
DOTEST(molly);
DOTEST(molly2);
printf(" %d/%d\n",end);
}
int
main(void)
{
dotest(0xe7e7,3,3);
dotest(0xe7e7,7,4);
dotest(0xe7e7,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。