假设我们在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)
这不行!我有一个零点在我的号码中间,如果不使用一个算法,我就无法摆脱。这是做一件非常容易的事情的漫长的道路
本质上,有没有办法让指针只读取数据中的特定位? 有没有其他语言允许这样做,或者只有通过编写机器代码才能实现? 我知道我想得太多了,实际上我并没有为此制定算法,这只是一种简单的提问方式
正如在评论中所说的那样,实际上应该让编译器开始它的工作并使用掩码。尽管如此,如果您想像上一个示例中那样消除间隙,您必须手动移动位
如果仍要访问单个位,可以使用位字段结构:
然后您可以访问单个字段:
(https://en.cppreference.com/w/cpp/language/bit_field)
作为替代方案,您也可以使用C++的std::bitset,它提供了一个很好的接口,您甚至不必手动定义结构。与以前一样,所生成的机器代码中仍将存在移位
这不仅仅是编程语言的问题,也是CPU本身的问题。一种语言或库所能提供的最多的功能是在shift&;CPU提取单个位所需的掩码
相关问题 更多 >
编程相关推荐