深入理解计算机系统第二章:信息的表示和处理 家庭作业

开工日期:2018年4月11号    完成日期:2018年4月26日     耗时:15日配置:centOS 7 64位+gcc4.8.5~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2.58int main(){    int a=1;    return *((unsigned char *)&am...
摘要由CSDN通过智能技术生成

开工日期:2018年4月11号    完成日期:2018年4月26日     耗时:15日

配置:centOS 7 64位+gcc4.8.5

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.58

int main()
{
    int a=1;
    return *((unsigned char *)&a);

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.59

int operator(int x,int y)
{
  return x&0xff | y&(~0xff);

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.60

unsigned replace_byte(unsigned x,int i,unsigned char b)
{
  unsigned int offset=0xff;    
  offset=offset<<(i<<3);       //为什么要*8呢,因为编号从0~w/8-1。    
  x=x&~offset;
  x=x | b<<(i<<3);
  return x;

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.61

a:

int is_INT_MAX(int x)

{
  return !(x+1);

}

b:

int is_INT_MIN(int x)
{
  return !(~x+1);
  //return is_INT_MAX(x-1);      //solution 2

}

c:

int is_low_byte(int x)
{
  //x=x&0x000000ff;           //solution 1
  //return is_INT_MIN(x-0xff);
  x=x|0xffffff00;
  return is_INT_MAX(x);

}

d:

int is_high_byte(int x)
{
  x=x>>((sizeof(int)-1)<<3);
  return is_low_byte(x);

}

测试单元:

int main()
{
  int x=0;
  int y=0xffffffff;
  int z=0xff123456;
  int p=0x0000000ff;
  printf("%d\n",is_INT_MAX(x));
  printf("%d\n",is_INT_MAX(y));
  printf("%d\n\n",is_INT_MAX(z));
  printf("%d\n",is_INT_MIN(x));
  printf("%d\n",is_INT_MIN(y));
  printf("%d\n\n",is_INT_MIN(z));
  printf("%d\n",is_low_byte(x));
  printf("%d\n",is_low_byte(y));
  printf("%d\n",is_low_byte(z));
  printf("%d\n\n",is_low_byte(p));
  printf("%d\n",is_high_byte(x));
  printf("%d\n",is_high_byte(y));
  printf("%d\n",is_high_byte(z));
  printf("%d\n",is_high_byte(p));
  return 0;
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.62

int int_shifts_are_arithmetic()
{
  return ~0==(~0>>1);

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=


2.63

unsigned srl(unsigned x,int k)
{
  unsigned xsra = (int) x >> k;
  unsigned sll = ~0<<(sizeof(int)<<3-k);
  sll=~sll;
  return xsra&sll;
}
int sra(int x,int k)
{
  int xsrl = (unsigned) x >> k;
  int sll  = ~0<<(sizeof(int)<<3-k);
  return xsrl+sll;

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.64

int any_odd_one(unsigned x)
{
  return !!(x&0x55555555);

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.65

int odd_ones(unsigned x)
{
  x^=x>>1;
  x^=x>>2;
  x^=x>>4;
  x^=x>>8;
  x^=x>>16;
  return x&1;

}

blog  这篇blog给出了我的分析

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.66

int leftmost_one(unsigned x)
{
  x|=x>>1;
  x|=x>>2;
  x|=x>>4;
  x|=x>>8;
  x|=x>>16;
  return x^(x>>1);

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.67

a:移位超过sizeof(x),UB未定义行为

b:将第10行改为 int beyond_msb = 2<31;

c:不让移31位?那就一次移15位嘛

int int_size_is_32()
{
  int a=1<<15;
  a<<=1;
  int set_msb=a<<15;
  int beyond_msb = (a<<15)<<1;
  return set_msb && !beyond_msb;

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.68

int lower_one_mask(int n)
{
    unsigned mask=~0;

    return (int)(mask>>(sizeof(int)*8-n));

    //return (2<<(n-1))-1;          //solution 2

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.69

unsigned rotate_left(unsigned x,int n)
{
  return (x>>(sizeof(int)*8-n)) | (x<<n);

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.70

知识点:补码的符号扩展

int fits_bits(int x,int n)
{
  int result=x>>n;
  return result==0 | ~result==0;         //result=0代表符号位为0    ,~result=0代表符号位为1

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.71

A.(word>>(bytenum<<3))&0xFF 结果是unsigned ,但是返回值却要int

B:

typedef unsigned packed_t;

int xbyte(packed_t word,int bytenum)
{
  unsigned result=word<<((3-bytenum)<<3);
  return (int)(result>>24);
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.72

这个题其实就是练习题2.26和旁注函数getpeername的翻版。

A:sizeof()返货size_t是无符号的,在if(maxbytes-sizeof(val)>=0)里,,有符号减去无符号,自动转为无符号的。所以maxbytes-sizeof(val)是一定是正值

B: getpeername做法: 

把maxbytes的类型改为size_t.

练习题2.26做法

把if中的语句

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值