| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 355 人关注过本帖
标题:练习题4
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
结帖率:94.64%
收藏
已结贴  问题点数:100 回复次数:3 
练习题4
写二个函数:
1、获取一个int的某个二进制位(bit),给定int,索引,返回对应索引的值(0或1)。
例:
printf("%d\n", get(0x80000000, 31));
输出: 1
printf("%d\n", get(0x00008000), 15);
输出:1

2、把一个int的某个二进制位(bit)设置为(0或1),给定int指针,索引,值(0或1)。
例:
int int_val = 0x80000000;
set(&int_val, 31, 0);
printf("#x\n", int_val);
输出:
0
int int_val = 0x0;
set(&int_val, 31, 1);
printf("%#x\n", int_val);
输出:
0x80000000

从练习5开始就由voidx出题啦,大家要干爸的哦。。。

参考答案:
程序代码:
#include <stdio.h>

int get(int val, int offset) {
    return ((unsigned)(val & (1 << offset))) >> offset;
}

void set(int * val, int offset, int bit) {
    bit ? (*val |= 1 << offset) : (*val &= ~(1 << offset));
}

int main(void) {
    printf("%d\n", get(0x80000000, 31));
    printf("%d\n", get(0x00008000, 15));
    int int_val = 0x80000000;
    set(&int_val, 31, 0);
    printf("%#x\n", int_val);
    int_val = 0x0;
    set(&int_val, 31, 1);
    printf("%#x\n", int_val);
    return 0;
}
/* Output:
1
1
0
0x80000000

Process returned 0 (0x0)   execution time : 0.156 s
Press any key to continue.
*/



[ 本帖最后由 lz1091914999 于 2011-6-26 10:31 编辑 ]
搜索更多相关主题的帖子: 参考答案 练习题 
2011-06-26 00:01
thunder_2011
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:31
专家分:100
注 册:2011-4-11
收藏
得分:50 
程序代码:
  1 #include <stdio.h>
  2 
  3 int get(int num, int index);
  4 void set(int * p, int index, int n);
  5 
  6 int main(void)
  7 {
  8     int int_val = 0x80000000;
  9 

 10     printf("%d\n", get(int_val,31));

 11     set(&int_val, 31, 0);

 12     printf("%#x\n", int_val);

 13 

 14     return 0;

 15 }

 16 

 17 int get(int num, int index)

 18 {

 19     if ((1 << index) & num == 0)

 20         return 0;

 21     return 1;

 22 }

 23 

 24 void set(int * p, int index, int n)

 25 {

 26     int s = 0, i = 0;

 27 

 28     for (i = 0; i<= 31; i++)

 29     {

 30         if (i != index)

 31         {

 32             s = s | (1 << i);

 33         }

 34     }

 35 

 36     if (n == 0)

 37         *p = *p & s;

 38     else

 39         *p = *p | (1 << index);

 40 

 41 }
2011-06-26 00:26
lccwyj
Rank: 4
等 级:业余侠客
帖 子:71
专家分:203
注 册:2011-5-6
收藏
得分:50 
程序代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<conio.h>
int f(int p,int n,int q)
{char m[1000],i,sum=0;
itoa(p,m,2);
if(n>strlen(m)||n<0)
{printf("error");return 3;}
else {m[n]=q+48;
for(i=0;i<strlen(m);i++)
sum=sum+(m[i]-48)*(int)pow(2,strlen(m)-i-1);
return sum;}}
int get(int i,int n)
{char m[1000];
itoa(i,m,2);
puts(m);
if(n>strlen(m)||n<0)
{printf("error");return 3;}
else return m[n]-48;}
main()
{int i,p,n;
printf("请输入数:");
scanf("%d",&i);
printf("请输入位数:");
scanf("%d",&n);
p=get(i,n);
printf("%d\n",p);
int q=f(i,n,0);
printf("%d",q);
getch();
}
2011-06-26 06:51
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 3楼 lccwyj
你似乎没有用位运算??

My life is brilliant
2011-06-26 10:32
快速回复:练习题4
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022715 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved