问题标签 [hammingweight]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
63 回答
588639 浏览

algorithm - 如何计算 32 位整数中设置的位数?

代表数字 7 的 8 位如下所示:

设置了三位。

确定 32 位整数中设置位数的算法是什么?

0 投票
23 回答
43915 浏览

c# - 优雅地确定多个布尔值是否为“真”

我有一组五个布尔值。如果其中一个以上是真的,我想执行一个特定的功能。你能想到的最优雅的方式是什么,它可以让我在一个 if() 语句中检查这个条件?目标语言是 C#,但我也对其他语言的解决方案感兴趣(只要我们不讨论特定的内置函数)。

一个有趣的选择是将布尔值存储在一个字节中,进行右移并与原始字节进行比较。但是这需要将单独的布尔值转换为字节(通过bitArray if(myByte && (myByte >> 1))?),这似乎有点(双关语)笨拙...... [编辑]对不起,应该是 if(myByte & (myByte - 1)) [/编辑]

注意:这当然非常接近经典的“人口计数”、“横向加法”或“汉明权重”编程问题——但并不完全相同。我不需要知道设置了多少位,只要它不止一个。我希望有一种更简单的方法来实现这一点。

0 投票
8 回答
29303 浏览

c - 用于计算无符号字符中“1”位数的 C 代码

我需要 C 代码来返回 C 中 unsigned char 中 1 的数量。如果不明显,我需要解释为什么它可以工作。我发现了很多 32 位数字的代码,但对于 unsigned char 却没有多少。

0 投票
9 回答
9539 浏览

matlab - 在matlab中有效地计算汉明权重

给定要解释为位字符串的 MATLAB uint32,计算字符串中有多少非零位的有效且简洁的方法是什么?

我有一个可行的、幼稚的方法来循环这些位,但这对我的需要来说太慢了。(使用 std::bitset count() 的 C++ 实现几乎立即运行)。

我发现了一个非常不错的页面,列出了各种位计数技术,但我希望有一种简单的 MATLAB 式方法。

http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive


更新#1

刚刚实现了 Brian Kernighan 算法如下:

性能仍然很糟糕,仅计算 4096^2 权重计算需要超过 10 秒。我的 C++ 代码使用 std::bitset 中的 count() 可以在亚秒时间内完成。


更新#2

这是迄今为止我尝试过的技术的运行时间表。当我得到更多的想法/建议时,我会更新它。

p>


评论:MATLAB 中的 dec2bin() 函数似乎实现得很差。它运行非常缓慢。

评论:“Naive bitget loop”算法实现如下:

评论: Scheiner 算法的循环展开版本如下所示:

0 投票
9 回答
12624 浏览

assembly - NASM:计算 32 位数字中有多少位设置为 1

我有一个 32 位数字,想知道有多少位是 1。

我在想这个伪代码:

有没有更有效的方法?

我在 x86 处理器上使用 NASM。

(我刚开始使用汇编程序,所以请不要告诉我使用外部库中的代码,因为我什至不知道如何包含它们;))

(我刚刚发现如何计算 32 位整数中的设置位数?其中也包含我的解决方案。发布了其他解决方案,但不幸的是我似乎无法弄清楚,我将如何在汇编程序中编写它们)

0 投票
4 回答
8708 浏览

c - 使用 Core 2 CPU (SSSE3) 的大型缓冲区的 Bit popcount

我正在寻找对 512 或更多字节的大缓冲区进行 popcount 的最快方法。我可以保证任何所需的对齐,并且缓冲区大小始终是 2 的幂。缓冲区对应于块分配,因此通常这些位要么全部设置,要么未设置,或者大部分设置有利于缓冲区的“左侧”,与偶尔的洞。

我考虑过的一些解决方案是:

我对最快的解决方案感兴趣,它必须在属于 core2 或更新版本的 32 位 x86 芯片组上工作。SSE 和 SIMD 非常有趣。我将在以下四核 CPU 上进行测试:

0 投票
5 回答
8424 浏览

assembly - 计算设置的位数

我想计算设置的二进制数中的位数。例如,用户输入数字 97,即二进制 01100001。该程序应该告诉我使用 MIPS ISA 设置了 3 位。

我能够在 C 中实现这一点,但我不知道如何使用汇编代码来实现它。

0 投票
8 回答
5366 浏览

java - 优化 Long.bitCount

我有一个程序正在对 Long.bitCount() 进行大量调用,如此之多以至于它在一个 CPU 内核上占用了 33% 的周期。有没有比 Sun JDK 版本更快的方法来实现它?

我试过了:

  • 这个算法(我认为这正是JDK的实现方式)
  • 2 8到 2 22之间的各种大小的查找表(一次查看几位并添加结果)

但是我没有比使用手动展开循环(大约 27% 的 CPU)的 2 16条目查找表做得更好的了。
这还能如何针对 Java 进行优化?


注意:这个问题是关于特定于 Java 的优化,但是这个类似的(与语言无关的)问题还有许多其他算法。

0 投票
4 回答
3045 浏览

java - .NET 相当于 Java 的 Integer.bitCount?

是否有类似于 JavaInteger.bitCount(int)Long.bitCount(long).NET Framework 中任何地方的方法?

(对于那些不熟悉这些 Java 方法的人)这也被称为:

  • 汉明重量
  • 人口计数(通常POPCNT在硬件中实现时调用。)

虽然 网上可以找到很多 实现但我想知道是否有标准库实现

我知道这不在BitArray,UInt32或中BitConverter,但也许在某个地方隐藏了一个版本,例如在加密函数中。

0 投票
4 回答
1759 浏览

sql - T-SQL 中的汉明权重/人口计数

我正在寻找一种快速的方法来计算 BINARY(1024) 字段的汉明权重/人口计数/“1 位的数量”。MySQL 有一个 BIT_COUNT 函数可以做类似的事情。我在 T-SQL 中找不到类似的函数?

或者您会建议将二进制数据存储在另一种类型的字段中吗?

如果你不知道我在说什么,这里有一篇关于汉明权重的维基百科文章