鱼C论坛

 找回密码
 立即注册
查看: 2548|回复: 14

[技术交流] 发个技术交流贴活跃一下气氛!!!!!!!!!

[复制链接]
发表于 2014-5-22 11:31:55 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 oggplay 于 2014-5-22 12:27 编辑

假设我们将一个w位的字节中的字节从0(最低位)到w/8-1位(最高位)编号。写出下面C函数的代码,它会返回一个无符号值,其中参数x的字节i被替换成字节b:

unsigned put_byte (unsigned x,unsigned char b,int i);


以下的一些示例,说明了这个函数该如何工作:
replace_byte ( 0x12345678 , 0xAB, 2) -->0x12AB5678
replace_byte ( 0x12345678 , 0xAB, 0) -->0x123456AB
特意限制了你能使用的编程结构,你的代码必须遵守下面规则:
*假设:
1、整数用补码形式表示。
2、有符号数的右移是算数右移。
3、数据类型int是w位长的。对于某些题目,会给定w的值,但是在其他情况下,只要w是8的整数倍,你的代码就应该能工作。你可以用表达式sizeof(int)<<3来计算w。
(4、考虑机器之间的移植,如大、小端机器,16位和32位或64位。)
*禁止使用:
1、条件语句(if或者?:)、循环、分支语句、函数调用和宏调用。
2、除法、模运算和乘法。
3、相对比较运算符(<、>、<=、和>=)。
4、强制类型转换,无论是显式还是隐式的。
*允许的运算:
1、所有位级运算和逻辑运算。
2、加减法
3、左、右移,但是位移的数量只能在0和w-1之间。
4、整型常数INT_MIN和INT_MAX。
5、相等(==)和不相等(!=)测试。


最佳答案

查看完整内容

#include unsigned put_byte (unsigned x,unsigned char b,int i) { unsigned mask=0xFF; mask=mask
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-22 11:31:56 | 显示全部楼层
#include <stdio.h>
unsigned put_byte (unsigned x,unsigned char b,int i)
{
        unsigned mask=0xFF;
        mask=mask<<(i<<3);
        mask=~mask;
        x&=mask;
        x|=b<<(i<<3);
        return x;
}
int main(void)
{
        unsigned a=0x12345678;
        printf("%x\n",put_byte(a,0xAb,0));
        printf("%x\n",put_byte(a,0xAb,2));
        return 0;
}
vs系列asm中可以使用局部变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-22 20:00:42 | 显示全部楼层
没人会??只能自己明天公布答案了:sweat:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-22 23:19:57 | 显示全部楼层
我是来膜拜楼主的。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-23 18:36:04 | 显示全部楼层
我同楼上一样 膜拜~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-23 19:37:56 | 显示全部楼层
#include <stdio.h>
unsigned put_byte (unsigned x,unsigned char b,int i)
{
        unsigned char *p=(unsigned char*)&x;
        *(p+i)=b;
        return x;
}
int main(void)
{
        unsigned a=0x12345678;
        printf("%x\n",put_byte(a,0xAb,0));
        printf("%x",put_byte(a,0xAb,2));
        return 0;
}

评分

参与人数 1鱼币 +1 收起 理由
oggplay + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-23 20:45:24 | 显示全部楼层
本帖最后由 oggplay 于 2014-5-23 20:47 编辑

没仔细看题 0分 你违反了禁止使用的第4条
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-23 20:57:22 | 显示全部楼层
#include <stdio.h>
unsigned put_byte (unsigned x,unsigned char b,int i)
{
                _asm
                {
                        lea esi,x
                        add esi,i
                        lea edi,b
                        mov ah,b
                        mov [esi],ah
                        sub esi,i
                        mov eax,[esi]
                }
}
int main(void)
{
        unsigned a=0x12345678;
        printf("%x\n",put_byte(a,0xAb,0));
        printf("%x",put_byte(a,0xAb,2));
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-23 21:04:41 | 显示全部楼层
本帖最后由 oggplay 于 2014-5-23 21:20 编辑
AepKill 发表于 2014-5-23 20:57
#include
unsigned put_byte (unsigned x,unsigned char b,int i)
{

嘻嘻,编译通不过,请用C语言编写函数代码就可以了,不需要内联汇编;另一点局部变量是不能出现在asm里边的,asm里只能用全局变量。
5.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-23 23:29:37 | 显示全部楼层
额。。。。看题都有些看不懂。。。膜拜一下大神。。然后看了5楼的程序,估计知道了题意,程序如下:
麻烦楼主大神检测一下。。。
  1. #include <stdio.h>
  2. unsigned put_byte (unsigned x,unsigned char b,int i)
  3. {
  4.                 unsigned tmp=x;
  5.                 x=x>>(i+1)*8;
  6.                 x=x<<8;
  7.                 x=x+b;
  8.                 x=x<<i*8;
  9.                 tmp=tmp<<(4-i)*8-1;
  10.                 tmp=tmp>>(4-i)*8-1;
  11.         x=x+tmp;
  12.         return x;
  13. }
  14. int main(void)
  15. {
  16.         unsigned a=0x12345678;
  17.       
  18.         printf("%x\n",put_byte(a,0xAb,0));
  19.         printf("%x\n",put_byte(a,0xAb,2));
  20.         return 0;
  21. }
复制代码

评分

参与人数 1鱼币 +1 收起 理由
oggplay + 1 虽然结果是对的,但是太勉强!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-24 08:28:39 | 显示全部楼层
本帖最后由 oggplay 于 2014-5-24 08:30 编辑
elvo 发表于 2014-5-23 23:29
额。。。。看题都有些看不懂。。。膜拜一下大神。。然后看了5楼的程序,估计知道了题意,程序如下:
麻烦楼 ...

存在bug.. 看到编译器警告了么? 抓图34.png
5分满分,只能给1分.:titter:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-24 08:33:52 | 显示全部楼层
本帖最后由 oggplay 于 2014-5-24 09:35 编辑
AepKill 发表于 2014-5-23 23:36
#include
unsigned put_byte (unsigned x,unsigned char b,int i)
{

不错,接近满分,你的函数可以简化一下:
unsigned replace_byte(unsigned x, unsigned char b, int i)
{
return ( b << (i << 3) ) | ( x & ~(0xff << (i << 3)) );
}




点评

不是说隐式类型转换也不能用吗? 你的return ( b  详情 回复 发表于 2014-5-24 10:30
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-24 10:30:04 | 显示全部楼层
oggplay 发表于 2014-5-24 08:33
不错,接近满分,你的函数可以简化一下:
unsigned replace_byte(unsigned x, unsigned char b, int i)
...

不是说隐式类型转换也不能用吗?
你的return ( b << (i << 3) ) | ( x & ~(0xff << (i << 3)) );
中b << (i << 3)是unsigned char 类型的, x & ~(0xff << (i << 3)是unsigned int类型的,
它们按位或的时候,unsigned char 类型会先隐式转换为unsigned int类型,然后再执行按位运算。
也就是说,你的这个答案违背了的你第4条规定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-24 11:23:55 | 显示全部楼层
本帖最后由 oggplay 于 2014-5-24 11:25 编辑
仰望天上的光 发表于 2014-5-24 10:30
不是说隐式类型转换也不能用吗?
你的return ( b

哈哈,这都被你看出来了,原稿书籍翻译错误,我就没改。将第4条隐式去掉。:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-20 10:54:48 | 显示全部楼层
:sad我还是太菜了,回去敲代码去了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表