如何在没有掩码的情况下检索数字的第一位(或特定位)?

2024-04-29 16:33:34 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们在16位工作

假设我有一个从一个非常大的数字列表中检索符号的算法。 我可以做类似的事情

sign=(number>0)-(number<0)

但我想比这更有效率

整数(或浮点)的第一位应存储其符号值。我怎么能告诉计算机只检索我号码的第一位呢? 我试过这个:

sign=number>>16

这工作得很好,但我真的想只读取1位,而不做任何类型的操作

存储这种类型的数据要容易得多。我们对每个条目执行此代码,并将其存储为二进制数

data= (data<<1) + sign

然而,检索这些数据更为复杂。 假设我想读取数字的前n位或最后n位。 我们可以这样做

last_10_bits= number & (0b000001111111111)
first_10_bits= (number & (0b111111111100000))>>5

这很好用,但是如果我想读取每一秒的位并将其存储在8bit中呢

bits_2nd = number % (-0b010101010101010)

这不行!我有一个零点在我的号码中间,如果不使用一个算法,我就无法摆脱。这是做一件非常容易的事情的漫长的道路

本质上,有没有办法让指针只读取数据中的特定位? 有没有其他语言允许这样做,或者只有通过编写机器代码才能实现? 我知道我想得太多了,实际上我并没有为此制定算法,这只是一种简单的提问方式


Tags: 数据代码算法类型number列表data符号
1条回答
网友
1楼 · 发布于 2024-04-29 16:33:34

正如在评论中所说的那样,实际上应该让编译器开始它的工作并使用掩码。尽管如此,如果您想像上一个示例中那样消除间隙,您必须手动移动位

如果仍要访问单个位,可以使用位字段结构:

struct S {
  unsigned int b : 3; // This field is 3 bits long
  unsigned int c : 1; // This one is a single bit
};

然后您可以访问单个字段:

struct S mystruct;
mystruct.b = ...;
mystruct.c = ...;

https://en.cppreference.com/w/cpp/language/bit_field


作为替代方案,您也可以使用C++的std::bitset,它提供了一个很好的接口,您甚至不必手动定义结构。与以前一样,所生成的机器代码中仍将存在移位


这不仅仅是编程语言的问题,也是CPU本身的问题。一种语言或库所能提供的最多的功能是在shift&;CPU提取单个位所需的掩码

相关问题 更多 >