有错误请指出,一起学习₍ᐢ •⌄• ᐢ₎
-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位而小于原来的数
·