![]() |
1
1
一个小的速度提高可能是通过先将整数或“加在一起”,然后使用结果来确定需要检查的位来实现的。您仍然需要迭代每个位,但在没有1的位上只迭代一次,而不是
|
![]() |
2
0
我带你去古典音乐: Bit Twiddling Hacks ,但您的目标似乎与典型的计数略有不同(即,您的“counts”变量的格式非常奇怪),但它可能会有用。 |
![]() |
3
0
我在这里能做的最好的事情就是把它弄糊涂,然后展开内部循环。。。似乎将性能降低了一半(大约4秒,而您的8秒处理100个Ulong 100000次)。。。我使用qick命令行应用程序生成以下代码:
那是我能做的最好的了。。。根据我的评论,在32位环境中运行它会浪费一些(我不知道有多少)。如果你担心你的表现呢 也许 让您首先将数据转换为uint。 棘手的问题。。。甚至可以让你把它封为C++,但这完全取决于你的应用程序。对不起,我帮不上忙了,也许其他人会看到我错过的东西。 耸肩 我试过了。 |
![]() |
4
0
通过在lef中将每一位移位n*8,将64位整数中的每个字节更改为64位整数 例如 (使用该翻译的查找表) 然后,用正确的方法将所有字符相加,就得到了无符号字符和整数的数组。 必须进行8*(64位整数的数量)求和 c代码
这个冗余的速度比单纯的执行速度快了8倍,因为它每次可以达到8位。
我修改了代码,在较小的整数上进行更快的中断,但我仍然不确定endianess 这只适用于多达256个输入,因为它使用无符号字符来存储数据。如果您有更长的输入字符串,可以将此代码更改为最多保留2^16位计数,并将spped减少2 |
![]() |
5
0
|
![]() |
6
0
另一种可能有利可图的方法是构建一个256个元素的数组, 下面是一个4元素表的示例,它执行2位而不是8位。
然后,算法退化为:
现在有一个问题我忽略了,在这个描述中。实际下标是相对的。您需要跟踪您在计数数组中的位置。每次循环时,都会向偏移量添加两个。向该偏移量添加bitToSubscript数组中的相对下标。 根据这个小例子,应该可以放大到您想要的大小。我认为可以使用另一个程序来生成bitToSubscript数组的源代码,这样就可以在程序中对其进行简单的硬编码。 这个方案还有其他的变化,但我希望它的平均运行速度比任何一次只运行一点的方案都要快。 猎得好。 恶毒的 |
![]() |
7
0
我相信这会给速度带来很好的提升:
演示: http://ideone.com/eNn4O (需要更多的测试用例) |
![]() |
8
-1
http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive 其中一个
请记住,此方法的复杂性约为O(log2(n)),其中n是要计算位的数字,因此对于10个二进制文件,它只需要2个循环 你可能应该采用这种方法,用64位算术计算32位,并将其应用于每半个单词,2*15+4指令需要多少
|
![]() |
no one special · 32位整数缩放,无溢出 6 年前 |
![]() |
Benn Tan · 比特操作:更难翻动硬币 7 年前 |
![]() |
Ganesh Thampi · 使用位运算符将十进制转换为二进制 7 年前 |
![]() |
Ganesh Thampi · 使用位的奇偶程序 7 年前 |
![]() |
datapanda · 三维网格的莫顿反向编码 7 年前 |
![]() |
rubyquartz · 交换无符号短整数的字节 7 年前 |
|
John Proctor · C中位的掩蔽范围 7 年前 |
![]() |
Areg Sarvazyan · 从无符号int中提取位的函数 7 年前 |
|
user9505617 · 按位异或0xFFFFFFFF? 7 年前 |