代码

时间:2017-01-07 18:18:20

标签: c

我需要编写以下函数: 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

1 个答案:

答案 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);
}