开工日期: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中的语句