深入理解计算机网络(第二章)

有错误请指出,一起学习₍ᐢ •⌄• ᐢ₎

-2.59

x & 0xff | y & ~0xff

-2.60

unsigned replace_byte(unsigned x, int i, unsigned char b) {
	int u = x & (~0xff << (i * 8 ));
	unsigned s = -1;
	unsigned t = b << (i * 8);
	return u | t |x & s >> (sizeof(int) - i) * 8;
}

-2.61
A:x || 0xffffffff
B:X & 0xffffffff
C:x || 0xf
D:x & 0xf

-2.62

int int_shifts_arithmetic(void) {
	int32_t x = 0xffffffff;	
	x >> 1;
	return x == 0xffffffff;
	}

- 2.64

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

-2.65

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

-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:
函数第6行中的“1<<32”

解释:C11标准指出移位运算符中如果右操作数的值为负值,或大于或等于提升的左操作数的宽度,则它未定义的行为。

B:

int bad_int_size_is_32() {
	int set_msb = 1 << 31;
	int beyond_msb =1 << 31<<1;
	return set_msb && !beyond_msb;
}

C:

int bad_int_size_is_16() {
	int16_t set_msb = 1 << 15;
	int16_t beyond_msb = 1 << 15<<1 ;
	return set_msb && !beyond_msb;
}

-2.68

int lower_one_mask(int n) {
	unsigned i = -1;
	return i >> sizeof(int) * 8 - n;
}

原理:n为多少就移位到剩下多少

int lower_one_mask(int n) {
	return (2<<(n-1))-1;
}

原理:假设w=4B2U [1000] - 1 = B2U [0111]

-2.69

unsigned rotate_left(unsigned x, int n) {
	unsigned o = -1 << (sizeof(unsigned) * 8 - n);//1
	unsigned i = x & o;//2
	return x << n | (i >> (sizeof(unsigned) * 8 - n));//3
}

原理:1 : 先算出掩码0,2 : 将它和i取“与”得到要放到后面的位,3 : x左移留出空位,然后在把i右移到合适的位置上和x取“或”

-2.70

int fits_bits(int x, int n) {
	x = x >> n - 1;
	return !x ||!(~x);
}

-2.71
A : 题目说抽取完指定字节后再把它符号扩展为32位的int,而前任只是取出了指定的字节并没有进行符号扩展

B:

int xbyte(unsigned word,int bytenum) {
	int i = (word >> (bytenum << 3)) & 0xff;
	return (i << sizeof(int) * 3 - bytenum) >> sizeof(int) * 3 - bytenum;
}

-2.72
A:当maxbytes很小的时候减去sizeof(val)时会变成一个很大的正数所以条件测试总是能成功

B:maxbytes == 0 && maxbytes >= sizeof ( val )

-2.74

int tsub_ok(int x, int y) {
	int64_t i = (int64_t)x + (int64_t)y;
	return i != (int)i;	
}

-2.76
题目都说要用函数调用了,前面的限制难道解除?感觉不用条件判断也写不出(捂脸)

void* calloc(size_t nmemb, size_t size) {
	unsigned long nsize = nmemb * size;

	if (nmemb == 0 || size == 0 || nsize > 0xffff) {
		return NULL;
	}
	else {
		char *s =(char*) malloc(nsize);
		memset(s, 0, (unsigned)nsize);
		return s;
	}
}

-2.77

A:
x<<4+x
B:
x-x<<3
C:
x<<6-x<<2
D:
x<<4-x<<7

-2.78

int divide_power2(int x, int k) {
	int i = x >> k;
	int a = x >> sizeof(int) * 8 - 1 && x & 0x1;
	i = i + a;
	return i;
}

-2.82

A:
×,当x(y)为Tmin的时候,-x(-y)同样为Tmin,结果就不相同
B:
,((x+y)<< 4)+y-x = 16x+16y+y-x = 17x+15y
C:
×,同A
D:
,补码和无符号具有相同的位级模式
E:
,可能由于丢失低2位而小于原来的数
·

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值