fits_bits - n位二进制补码能表示x?能返回1,否则返回0
时间: 2024-02-11 18:08:46 浏览: 114
这是一个比较简单的问题,fits_bits函数可以如下实现:
```c
int fits_bits(int x, int n) {
int max = (1 << (n - 1)) - 1;
int min = -(1 << (n - 1));
return x >= min && x <= max;
}
```
函数中,首先计算出n位二进制补码的最大值和最小值(考虑到有符号数的表示,最大值为2^(n-1)-1,最小值为-2^(n-1)),然后判断x是否在这个范围内,如果是则返回1,否则返回0。
相关问题
get_byte - 从x中提取指定的字节n * 字节编号: 从0 (LSB) 到 3 (MSB) * Ex: get_byte(0x12345678,1) = 0x56 */ int get_byte(int x, int n) { } /* count * bit_cnt - x二进制表示中1的个数 * Ex: bit_cnt(5) = 2, bit_cnt(7) = 3 */ int bit_cnt(int x) { } /* * is_positive - 如果 x > 0 返回1,否则返回0 * Ex: is_positive(-1) = 0. *不能直接用> */ int is_positive(int x) { } /* * neg - 返回 -x * Ex: neg(1) = -1. */ int neg(int x) { } /* * fits_bits - n位二进制补码能表示x?能返回1,否则返回0 * 1 <= n <= 32 * Ex: fits_bits(5,3) = 0, fits_bits(-4,3) = 1 */ int fits_bits(int x, int n) { } /***********************浮点数相关功能函数****************************/ */ /* * float_neg - 返回浮点数f的相反数-f(位级表示) * 当参数是 NaN是返回原参数. * 不用符号 */ float float_neg(float f) { } /* * double_float - 返回参数f的2倍值 2*f * 参数和结果都以unsigned int的形式传递, * 但他们都被解释为float的位级形式 * 当参数是 NaN是返回原参数. */ unsigned double_float(unsigned uf) { }。用c语言完成,并给出详细代码
以下是对应的代码实现:
```
/*
* get_byte - 从x中提取指定的字节n
* 字节编号:从0 (LSB) 到 3 (MSB)
* Ex: get_byte(0x12345678,1) = 0x56
*/
int get_byte(int x, int n) {
return (x >> (n << 3)) & 0xFF; // 右移位数为 n * 8,取出对应字节
}
/*
* bit_cnt - x二进制表示中1的个数
* Ex: bit_cnt(5) = 2, bit_cnt(7) = 3
*/
int bit_cnt(int x) {
int cnt = 0;
while (x) { // 遍历x的二进制位
cnt += x & 1; // 如果当前位为1,计数器加1
x >>= 1; // 右移一位
}
return cnt;
}
/*
* is_positive - 如果 x > 0 返回1,否则返回0
* Ex: is_positive(-1) = 0.
* 不能直接用>
*/
int is_positive(int x) {
return !((x >> 31) & 1) && !!x; // 判断最高位是否为1,以及x是否为0
}
/*
* neg - 返回 -x
* Ex: neg(1) = -1.
*/
int neg(int x) {
return ~x + 1; // 取反加一
}
/*
* fits_bits - n位二进制补码能表示x?能返回1,否则返回0
* 1 <= n <= 32
* Ex: fits_bits(5,3) = 0, fits_bits(-4,3) = 1
*/
int fits_bits(int x, int n) {
int mask = x >> 31; // 获取最高位的符号位
return !(((~x & mask) + (x & ~mask)) >> (n + ~0)); // 判断是否超出n位二进制补码表示范围
}
/***********************浮点数相关功能函数****************************/
/*
* float_neg - 返回浮点数f的相反数-f(位级表示)
* 当参数是 NaN 是返回原参数.
* 不用符号
*/
float float_neg(float f) {
unsigned uf = *(unsigned *)&f; // 将float类型的指针转化为unsigned类型的指针,获取位级表示
if ((uf & 0x7F800000) == 0x7F800000 && (uf & 0x7FFFFF)) // 判断是否为 NaN
return f;
else
return *(float *)&(uf ^ 0x80000000); // 取反符号位
}
/*
* double_float - 返回参数f的2倍值 2*f
* 参数和结果都以unsigned int的形式传递,
* 但他们都被解释为float的位级形式
* 当参数是 NaN 是返回原参数.
*/
unsigned double_float(unsigned uf) {
if ((uf & 0x7F800000) == 0x7F800000 && (uf & 0x7FFFFF)) // 判断是否为 NaN
return uf;
else {
int exponent = (uf >> 23) & 0xFF; // 获取指数
if (exponent == 0) // 如果指数为0
return (uf & 0x80000000) | (uf << 1); // 左移一位
else if (exponent == 0xFF) // 如果指数为全1
return uf;
else
return uf + (1 << 23); // 尾数加1
}
}
```
bit_and(x, y) 只用~与|实现x&y get_byte(x, n) 获取x的第n各字节 logical_shift(x, n) 逻辑右移 bit_cnt(x) x二进制表示中1的个数 not(x) 不使用!运算符实现!x tmin() 最小的有符号数(32位) fits_bits(x, n) n位二进制补码能表示x吗? divpwr2(x, n) 计算x/2 n neg(x) 不用-运算符实现-x is_positive(x) x > 0? is_le(x, y) x <= y? floor_log2(x) 计算不超过log2x的整数 float_neg(uf) 计算-ffloat_i2f(x) 求x的位级表示 float_scalce2(uf) 计算2倍的f,用c语言完成上述问题,并给出代码
好的,我会回答你的问题,并不会透露你的任何要求。
1. 实现 bit_and(x, y) 只用~与|:
```
int bit_and(int x, int y) {
return ~(~x | ~y);
}
```
2. 实现 get_byte(x, n) 获取x的第n个字节:
```
int get_byte(int x, int n) {
return (x >> (n << 3)) & 0xff;
}
```
3. 实现 logical_shift(x, n) 逻辑右移:
```
int logical_shift(int x, int n) {
int mask = ~(((1 << 31) >> n) << 1);
return (x >> n) & mask;
}
```
4. 实现 bit_cnt(x) x二进制表示中1的个数:
```
int bit_cnt(int x) {
int cnt = 0;
while (x) {
cnt += x & 1;
x >>= 1;
}
return cnt;
}
```
5. 实现 not(x) 不使用!运算符实现!x:
```
int not(int x) {
return ~x + 1;
}
```
6. 实现 tmin() 最小的有符号数(32位):
```
int tmin() {
return 1 << 31;
}
```
7. 实现 fits_bits(x, n) n位二进制补码能表示x吗?
```
int fits_bits(int x, int n) {
int shift = 32 + ~n + 1;
return !(x ^ ((x << shift) >> shift));
}
```
8. 实现 divpwr2(x, n) 计算x/2^n:
```
int divpwr2(int x, int n) {
int sign = x >> 31;
return (x + (sign & ((1 << n) + ~0))) >> n;
}
```
9. 实现 neg(x) 不用-运算符实现-x:
```
int neg(int x) {
return ~x + 1;
}
```
10. 实现 is_positive(x) x > 0?:
```
int is_positive(int x) {
return !((x >> 31) | !x);
}
```
11. 实现 is_le(x, y) x <= y?:
```
int is_le(int x, int y) {
int sign = 1 << 31;
int x_sign = x & sign;
int y_sign = y & sign;
int same_sign = !(x_sign ^ y_sign);
int diff_sign = x_sign & !y_sign;
return same_sign & ((y + ~x + 1) >> 31) | diff_sign;
}
```
12. 实现 floor_log2(x) 计算不超过log2x的整数:
```
int floor_log2(int x) {
int mask = x >> 31;
int shift = 0;
x = (mask & ~x) | (~mask & x);
shift |= !!(x >> 16) << 4;
x >>= shift;
shift |= !!(x >> 8) << 3;
x >>= shift;
shift |= !!(x >> 4) << 2;
x >>= shift;
shift |= !!(x >> 2) << 1;
x >>= shift;
shift |= !!(x >> 1);
x >>= shift;
return shift | x;
}
```
13. 实现 float_neg(uf) 计算-f:
```
unsigned float_neg(unsigned uf) {
unsigned exp = uf & 0x7f800000;
unsigned frac = uf & 0x007fffff;
if (exp == 0x7f800000 && frac != 0) {
return uf;
}
return uf ^ 0x80000000;
}
```
14. 实现 float_i2f(x) 求x的位级表示:
```
unsigned float_i2f(int x) {
unsigned sign = x & 0x80000000;
if (x == 0) {
return 0;
}
int abs_x = x;
if (sign) {
abs_x = -x;
}
int exp = 158;
while (!(abs_x & 0x80000000)) {
abs_x <<= 1;
exp -= 1;
}
unsigned frac = (abs_x & 0x7fffffff) >> 8;
if (abs_x & 0x000001ff) {
frac += 1;
if (frac & 0x00800000) {
frac = 0;
exp += 1;
}
}
return sign | (exp << 23) | frac;
}
```
15. 实现 float_scalce2(uf) 计算2倍的f:
```
unsigned float_scalce2(unsigned uf) {
if ((uf & 0x7f800000) == 0x7f800000) {
return uf;
}
if ((uf & 0x7f800000) == 0) {
return (uf & 0x80000000) | (uf << 1);
}
return uf + (1 << 23);
}
```
阅读全文