我需要编写以下函数: int64_t get_bits(int64_t val,uint bit_n,uint len);
其中 val - 64位有符号整数, bit_n - val 中的位数(0 <= bit&lt; = 64 ), len - 位数(0&lt; bit_n + len&lt; = 64)。该函数应从 bit_n 开始提取 len 位(编号从0开始)。提取的位应表示为64位有符号整数,该函数应返回。
这就是我得到的:
#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
int64_t get_bits(int64_t val, uint bit_n, uint len) {
uint64_t tmp = val;
tmp = tmp << (64 - bit_n - len);
val = tmp;
val = val >> (64 - len);
return val;
}
int main() {
printf("%" PRId64"\n", get_bits(1, 0, 1)); // -1 = OK
printf("%" PRId64"\n", get_bits(-1022, 1, 2)); // 1 => OK
printf("%" PRId64"\n", get_bits(65535, 9, 12)); // 127 => OK
return 0;
}
当我在计算机上测试时,它可以正常工作(主要的例子)。但是当我将它发送到测试系统时,它会出现运行时错误。我认为这是因为定义的实现,与签名号码的移位有关。 你能提供一些如何解决这个错误的提示吗?
编译器选项:
gcc GNU C 6.3.0 -O2 -Wall -Werror -std=gnu11 -lm
答案 0 :(得分:0)
不确定你的逻辑是否在bit_n上提取len位我用掩码来做。
int64_t get_bits(int64_t val, uint bit_n, uint len) {
uint64_t mask;
mask = ((1 << len) - 1) << bit_n
return (val & mask);
}