![]() |
1
6
对于随机访问单独的位,您建议的宏是尽可能好的(只要您打开编译器中的优化)。 如果对你正在访问的位有任何模式,那么你可能会做得更好。例如,如果您经常访问 对 那么,通过提供一种方法来获得两个位而不是一个位,您可能会看到一些改进,即使您并不总是使用这两个位。 与任何优化问题一样,您需要非常熟悉代码的行为,特别是位数组中的访问模式,以便在性能上做出有意义的改进。 更新 :因为您可以访问位的范围,所以您可能会从宏中榨取更多的性能。例如,如果需要访问四位,您可能有如下宏:
这些宏将从每个位的位置0、1、2等中裁剪出四个位(为了减少无意义括号的扩散,您可能需要使用上面的内联函数。)然后定义一个内联函数,例如:
由于这是许多冗长的样板代码,特别是如果有多个不同的宽度,您可能需要编写一个程序来生成
(我注意到您字节中的位存储顺序与我上面写的相反。如果需要,请应用适当的转换来匹配您的结构。) |
![]() |
2
7
我不这么认为。事实上,许多CPU架构不能单独访问位。
关于C++你有
顺便说一句,将位数组分组为
|
![]() |
3
3
以格雷格的解决方案为基础:
即使它们没有对齐,也可以得到至少32位。注意这是故意的
|
![]() |
4
1
如果在“arr”中反转位顺序,则可以从宏中消除减法。这是我能说的最好的话,不知道问题的上下文(如何使用位)。 |
![]() |
5
1
可以优化。 1)使用标准int,它通常是最快访问的整数数据类型。 如果不需要便携,可以通过 调整以下代码。 2)
mod运算符%比anding慢。你不需要减去, 只需调整设置位程序。 |
![]() |
6
0
为什么不创建自己的包装类呢? 然后,可以使用+等运算符向“数组”中添加位,并使用[]运算符返回各个位。 您的宏可以通过使用&7而不是%8来改进,但编译器很可能会为您进行优化。 我最近做的正是你在做的,我的流可能包含任何数量的位。 所以我有如下内容:
等等。它提供了一个可读性很好的代码,您可以为它提供一个类似STL的接口来帮助Faimillarity:) |
![]() |
7
0
既然问题是用C++来标记的,你有什么理由不能简单地使用这个标准? bitset ? |
![]() |
8
0
您可以使用
|
![]() |
no one special · 32位整数缩放,无溢出 7 年前 |
![]() |
Benn Tan · 比特操作:更难翻动硬币 7 年前 |
![]() |
Ganesh Thampi · 使用位运算符将十进制转换为二进制 7 年前 |
![]() |
Ganesh Thampi · 使用位的奇偶程序 7 年前 |
![]() |
datapanda · 三维网格的莫顿反向编码 7 年前 |
![]() |
rubyquartz · 交换无符号短整数的字节 7 年前 |
|
John Proctor · C中位的掩蔽范围 7 年前 |
![]() |
Areg Sarvazyan · 从无符号int中提取位的函数 7 年前 |
|
user9505617 · 按位异或0xFFFFFFFF? 7 年前 |