LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
extract_bits.c
浏览该文件的文档.
1/*
2 * LAMMP - Copyright (C) 2025-2026 HJimmyK(Jericho Knox)
3 * This file is part of lammp, under the GNU LGPL v2 license.
4 * See LICENSE in the project root for the full license text.
5 */
6
7#include "../../include/lammp/lmmpn.h"
8
9mp_bitcnt_t lmmp_extract_bits_(mp_srcptr restrict num, mp_size_t n, mp_limb_t* restrict ext, int bits) {
10 lmmp_param_assert(bits <= LIMB_BITS && bits > 0);
11 lmmp_param_assert(n > 0);
12 if (n == 1) {
13 int lb = lmmp_limb_bits_(num[0]);
14 if (lb <= bits) {
15 *ext = num[0];
16 return 0;
17 } else {
18 *ext = num[0] >> (lb - bits);
19 return lb - bits;
20 }
21 } else {
22 int lb = lmmp_limb_bits_(num[n - 1]);
23 if (lb < bits) {
24 *ext = num[n - 1] << (bits - lb);
25 *ext |= num[n - 2] >> (LIMB_BITS - bits + lb);
26 return LIMB_BITS * (n - 1) - (bits - lb);
27 } else if (lb == bits) {
28 *ext = num[n - 1];
29 return LIMB_BITS * (n - 1);
30 } else {
31 *ext = num[n - 1] >> (lb - bits);
32 return LIMB_BITS * (n - 1) + (lb - bits);
33 }
34 }
35}
mp_bitcnt_t lmmp_extract_bits_(mp_srcptr restrict num, mp_size_t n, mp_limb_t *restrict ext, int bits)
Definition extract_bits.c:9
size_t mp_bitcnt_t
Definition lmmp.h:217
uint64_t mp_size_t
Definition lmmp.h:212
const mp_limb_t * mp_srcptr
Definition lmmp.h:216
uint64_t mp_limb_t
Definition lmmp.h:211
#define LIMB_BITS
Definition lmmp.h:221
#define lmmp_param_assert(x)
Definition lmmp.h:398
int lmmp_limb_bits_(mp_limb_t x)
计算满足 2^k > x 的最小自然数k
Definition tiny.c:11