gpt4 book ai didi

c - 如何从C中的数字中提取特定位?

转载 作者:行者123 更新时间:2023-11-30 17:33:31 24 4
gpt4 key购买 nike

我需要提取 C 中 short 数据类型的特定部分(位数)。

例如,我有一个二进制 52504 为 11001101000 11000,我想要前 6 位(从 LSB --> MSB,即 011000 十进制 24)位和其余 10 位(11001101000 十进制 820)。

同样,我希望这个函数过于笼统,无法提取给定“开始”和“结束”的特定位数(即与某个十进制值等效的位 block )。

我检查了其他帖子,但这些帖子没有帮助,因为给定的函数不太通用。

我需要一些适用于 C 的 short 数据类型的东西。

编辑

我有大小为 2048 字节的短数组。其中每个像素为 10 位。所以我的 16 位由每个字节组成,有时占用 2 个像素数据,有时占用 3 个像素数据。

喜欢

(像素:0,1) 10 位 + 6 位

然后(像素:1,2,3) 4 BITS(第一个像素剩余位)+ 10 BITS + 2 BITS。

等等..这种模式仍在继续......所以,我想提取每个像素并制作一个完整的数组,让每个像素完全占据整个字节(16 位),就像......1 个字节应包含 1 个 DATA PIXEL,另一个 BYTE 应包含整个 16 位的其他 PIXEL 值,依此类推。

最佳答案

您需要了解两个构建 block 才能自己构建它:

  • 获取N最低有效位需要使用 N 构造位掩码那些在最后。你这样做:((1 << N)-1)1 << N2 ^ N :它有一个 1N+1 st 位置,其后全为零。减去 1 即可得到所需的掩码。
  • 删除M最低有效位是简单的右移:k >> M

现在你的算法从 M 中删除至N变成一个两步过程:移动原始值 M位向右移动,然后按位执行 AND戴着N-M的面具的。

#define LAST(k,n) ((k) & ((1<<(n))-1))
#define MID(k,m,n) LAST((k)>>(m),((n)-(m)))

int main() {
int a = 0xdeadbeef;
printf("%x\n", MID(a,4,16));
return 0;
}

该片段将 4 位(含)和 16 位(不包括)剪切掉,并打印 bee当你运行它时。位从零开始编号。

关于c - 如何从C中的数字中提取特定位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23725921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com