如何将 C unsigned int 中的底部 n 位清零?

Posted

技术标签:

【中文标题】如何将 C unsigned int 中的底部 n 位清零?【英文标题】:How to zero out bottom n bits in a C unsigned int? 【发布时间】:2013-02-10 06:54:07 【问题描述】:

我正在尝试编写自己的 C 楼函数。我被困在这个代码细节上。我只想知道如何将 unsigned int 的底部 n 位归零。

例如,要将 51.5 舍入到 51.0,我需要将底部 18 位归零,并保留前 14 位。由于它是一个底函数,我想制作一个掩码以将底部归零(23 减去指数)来自浮点表示的位。我知道如何为这样的个别情况制作面具,但我不确定如何对其进行编码以使其适用于所有人。请帮忙。

【问题讨论】:

int floor(float number) return (int)number; 工作 下定决心 - 数字和无符号是短的还是浮点数?你试过什么? 抱歉,刚刚编辑。该数字是一个无符号整数 我正在尝试将 unsigned int 的底部位归零。 我已经做了一些例子。要将 51.5 舍入到 51.0,我需要保留数字的前 14 位。所以我会做数字和FFF20000。但由于每次都会有所不同,我不确定如何编写适合所有人的东西。 【参考方案1】:

一个更简单的方法就是这样做:

value = (value >> bits) << bits

因为左移会用零填充它,而不是其中的任何内容。

【讨论】:

我特别喜欢这个。非常优雅。 非常感谢你们!! 对不起,你能解释一下这里的比特和价值吗?在我试图保留前 14 位的示例中,掩码是否应该是这样的: value = (value >> 14) 【参考方案2】:

将一个数字左移 N 位。减一。反转位。还有你需要屏蔽的号码。

1 << 14 = 00000000000000000010000000000000
     -1 = 00000000000000000001111111111111
     ~  = 11111111111111111110000000000000

当你and 时,掩码中的 1 将保留输入,掩码中的 0 会将结果设置为 0。

【讨论】:

以上是关于如何将 C unsigned int 中的底部 n 位清零?的主要内容,如果未能解决你的问题,请参考以下文章

在 c 中的 unsigned short int 中分配零

用C语言如何将一个一维数组中的元素随机排序

C语言实现unsigned char 转换unsigned int?

如何使用 JNI 从本机 c 库将 double 和 unsigned int 返回到 java

C语言中的unsigned int是啥

如何获取一个unsigned char*类型的字符串长度