【发布时间】:2021-06-23 18:53:47
【问题描述】:
假设我们在 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
这很好用,但是如果我想读取每一秒位并将其存储在 8 位中怎么办?
bits_2nd = number % (-0b010101010101010)
这行不通!我的号码中间有一堆零,如果不使用算法,我无法摆脱。做一件很容易的事,这是一条很长的路。
本质上,有没有办法让指针只读取我数据中的特定位? 是否有任何其他语言允许这样做,或者这只能通过编写机器代码来实现? 我知道我想太多了,我实际上并没有为此制定算法,这只是提出难题的一种简单方法。
【问题讨论】:
-
你想多了。使用掩码,让优化编译器完成它的工作。
-
cpu 操作的是字节,而不是位。所以不,不可能,即使在汇编语言中也不行。你必须掩饰和转移。为了帮助解决这个问题,有一本书叫做 Bit Twiddling Hacks 或类似的东西。
-
可以使用pext 指令从中间删除零
-
要获取 16 位数字的符号位,您将使用
number >> 15而不是sign=number>>16。如前所述,CPU 无法加载单个位。事实上,像 DEC Alpha 这样的许多 CPU 甚至无法加载小于寄存器大小的值。而且您还必须从 RAM 中加载整个单词。没有办法从中读取一个字节
标签: python c++ optimization bit-manipulation