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

    技术2022-07-17  84

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

    -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=4,B2U [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位而小于原来的数 ·

    Processed: 0.016, SQL: 9