C语言位运算问题

ProgrammingRing 2009-08-02 12:39:14
(1)编写程序实现取一个整数a从右端开始的4-7位。

(2)定义一个位段,使其满足下面的要求:
①a有2位。
②b有2位。
③c2位。
④d有4位,且另起一个存储单元。
⑤f有7位。
上面两道题是我书位运算后面的两道程序设计题。。我只能不确定的搞出2,1实在不知道该怎么搞,求解!
(2)我的答案,不知道对不对:
struct t
{
unsigned a:2;
unsigned b:2;
unsigned c:2;
unsigned :0;
unsigned d:4;
unsigned f:7;
}data;
...全文
230 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mstlq 2009-08-02
  • 打赏
  • 举报
回复
第一题代码参看下面^_^
建议楼主还是多看课本^_^

#include <stdio.h> 

void showBit(int num,int index)
{
printf("数字%d的右边第%d位是%d\n",num,index, (num>>(index-1))&1);
};

int main(void)
{
int num;
scanf("%d",&num);
showBit(num,4);
showBit(num,5);
showBit(num,6);
showBit(num,7);
system("pause");

return 0;
}
mstlq 2009-08-02
  • 打赏
  • 举报
回复
第二题直接按下面的方式应该可以了,第一个存储单元填完abc后,剩余2bit装不下d,d自然会从另一个存储单元存起的……
struct t 
{
unsigned a:2;
unsigned b:2;
unsigned c:2;
unsigned d:4;
unsigned f:7;
}data;
xjxhsjl 2009-08-02
  • 打赏
  • 举报
回复
学习了
Aaron_Jerry 2009-08-02
  • 打赏
  • 举报
回复
扩展下:取一个整数num的从右端开始的m到n位

#define GET_M_TO_N_BITS(num,m,n) ((~(0xffffffff << (n) + 1)) & (num)) >> (m))
Aaron_Jerry 2009-08-02
  • 打赏
  • 举报
回复
(1)

#define GetFourBits(n) ((0x0f << 4) & (n)) >> 4
cheng_fengming 2009-08-02
  • 打赏
  • 举报
回复
如果是32位机的话,要得到右端4-7位,通过左移(<<)和右移(>>)运算符就可以得到。
如下面的一个数:
0000 0000 0000 1101 0101 1011 1010 1101 //先左移25位
0101 1010 0000 0000 0000 0000 0000 0000 //再右移28位
0000 0000 0000 0000 0000 0000 0000 0101
xu044 2009-08-02
  • 打赏
  • 举报
回复
下面这个可以查看一个整数的所有位,你需要4-7位的话就自己修改一下吧。

#include <stdio.h>

int binary_print(unsigned char c)
{
int i;
for ( i = 0; i < 8; ++i)
( (c << i) & 0x80 ) ? putchar('1') : putchar( '0' );
putchar(' ');
return i;
}

int main()
{
int a, i;
unsigned char c_save[4];
void *ptr;
ptr = &a;
fputs( "请输入一个整数:", stdout );
scanf( "%d", &a );
for (i = 0; i < 4; i++)
c_save[i] = *( (unsigned char*)ptr + i );
puts( "此整数在计算机内存中的按位储存格式如下:" );
for (i = 4; i != 0; i--)
binary_print( c_save[i-1] );
putchar( '\n' );
return 0;
}

lijian22500 2009-08-02
  • 打赏
  • 举报
回复
struct t
{
unsigned a:2;
unsigned b:2;
unsigned c:2;
unsigned :2;
unsigned d:4;
unsigned f:7;
}data;

unsigned :2;凑数的。
akira88 2009-08-02
  • 打赏
  • 举报
回复
1
int a;
a &= 0xF << 3;
ies_sweet 2009-08-02
  • 打赏
  • 举报
回复
楼主第2题的答案是正确的。
fengxiquan 2009-08-02
  • 打赏
  • 举报
回复
up
starcat 2009-08-02
  • 打赏
  • 举报
回复
Done!

#include <stdio.h>
main()
{
int a, b;
scanf("%d", &a);
b = (a & (~(~0 << 4) << 3)) >> 3; /*~0 << 4 最右4位置0,~(~0 << 4)最右4位置1*/
printf("%d\n", b);
}

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧