- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道这是代码。但我无法理解它的作用
`public static int bitCount(long i){
i = i - ((i > > > 1) & 0x5555555555555555L);
i = (i & 0x3333333333333333L) + ((i > > > 2) & 0x3333333333333333L);
i = (i + (i > > > 4)) & 0x0f0f0f0f0f0f0f0fL;
i = i + (i > > > 8);
i = i + (i > > > 16);
i = i + (i > > > 32);
return (int)i & 0x7f;
}`
最佳答案
我们以255为例。随着我们的进行,这些位被组合在一起。首先,我们从 255 开始,作为 0b1111.1111
(二进制中的 8 个 1)
第一行代码是:
i = i - ((i > > > 1) & 0x5555555555555555L);
这条线正在梳理每一对 1。因为我们有 8 个 1,所以我们期望组合我们的对,并得到类似 2,2,2,2 的结果。由于它是二进制的,我们期望 10101010。
让我们看看i >> > 1
。我是 0b1111.1111
,这是向下移动 1,所以我们得到 0b0111.1111
。我们取 &
与 0b0101.0101
的交集(这是 5 在二进制中为 101)。这样做可以保留我们一半的位,特别是所有最初位于偶数点的位(我们初始数字的第 2、4、6、8 位)。
然后我们从我们的初始值中减去它,这有点 hacky。我们正在尝试将我们的最高位添加到我们的最低位,所以我们可以这样做:
((i > > > 1) & 0x5555) + (i & 0x5555)
左边的项是最高位,右边的项是最低位。但是我们知道 i = 2*(top bits) + 1*(bottom bits),因为 top bits 被上移 1(这与乘以 2 相同)。因此,通过将最高位减去 1 次,我们得到了相同的结果。
好的,现在我们准备好第二行代码了。我们目前有 i 的 0b1010.1010
,我们准备添加每对 2。我们期望得到 4,4(每一半使用 4 位),或 0100.0100
二进制。代码是:
i = (i & 0x3333333333333333L) + ((i > > > 2) & 0x3333333333333333L);
我们正在获取每组 4 个中前 2 个数字和后 2 个数字,并将它们相加。 0x3333 = 0b0011.0011.0011.0011
因此我们可以看到,&
与 3 的交集将底部的 2 个数字保持在一个组中。我们首先得到底部的两个数字,然后我们将 i 移动 2 个位置以获得顶部的 2 个数字。然后我们添加:0010.0010 + 0010.0010 = 0100.0100
。完全符合预期。
接下来我们将 2 组 4 个相加。
i = (i + (i > > > 4)) & 0x0f0f0f0f0f0f0f0fL;
0x0f0f = 0b0000111100001111
,因此如果我们与此相交,我们将保留每 4 个数字。我们将 i 加到其自身降档 4,因此我们计算 0100.0100 + 0000.0100 = 0100.1000
。 4 + 4 应该还给 8,并且 8 = 0b1000
,但是前面的“4”还是需要去掉。与 0f0f0f0f
的交集执行此操作。
所以现在我们有了 0b1000
,它是 8。其余的步骤添加了更高的位(比如 2 组 8 在一起,而不是 2 组 16..)但是因为我们的数字(255) 只有 8 位长,高位全为 0,所以这不会影响我们的结果。
关于java - Long.bitCount() 如何找到设置的位数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44093381/
假设我得到了两个整数 a, b 其中 a 是一个正整数并且小于 b 。我必须找到一种有效的算法,它会在 [a, b] 区间内给出 base2 位数(位数)的总和。例如,在区间 [0, 4] 中,数字之
到目前为止我已经尝试过不同的 autofilter但非选项似乎对我有用,我有许可证号列,其中应该只有 10 位数字,并且 autofilter我正在尝试查找少于或多于 10 位数字的条目, 我将该列转
谁能告诉我检查输入的数字是否为 3 位数字的正则表达式...它也不应该允许字母.... 最佳答案 3 个数字的正则表达式为 ^[0-9]{3}$ 或 ^\d{3}$ 关于javascript - 是否
我不知道这在 SQL Server 中是否可行,但我得问问它 ;-) 我在表 work 中有一个名为 duty 的列。 假设 Work.Duty 包含不同的数字,例如 (1, 2, 3, 20, 22
我正在运行一个我创建的java程序,它存储用户输入的数据。具体来说,有 4 个数组列表,分别是songName、songArtist、songYear 和songAlbum。我有一个“songYear
我不知道这在 SQL Server 中是否可行,但我得问问它 ;-) 我在表 work 中有一个名为 duty 的列。 假设 Work.Duty 包含不同的数字,例如 (1, 2, 3, 20, 22
给定一个 float ,我想使用半偶数舍入将结果四舍五入到小数点后四位,即四舍五入到下一个偶数的方法。例如,当我有以下代码片段时: #include #include int main(){
有没有一种方法可以在不使用小程序的情况下确定客户端计算机上的 jvm 位数?我确实看到了这个link但这决定了 jvm 版本而不是位数。提前致谢 最佳答案 您可以尝试确定浏览器位数 - 32 位 ja
我正在编写一个程序来计算给定数字的两个二进制表示之间的共同位数。我写的代码是: int common_bits(int a, int b) { static long binaryNo1,binary
如何使表格中的每个单元格的最小宽度为 3 位数字并且不会更大?现在我正在对 min-width 进行硬编码,但我不喜欢对值进行硬编码,因为将来我可能想更改字体。如果需要 Javascript 也没关系
我正在尝试匹配后跟一个空格或制表符和 5 个数字的单词。例如 some noise text off 12345 some noise text again. 另一个例子是: Some noise t
我在从 double 到 string 的转换时遇到问题。 我要转换: double value: 0.0772486324655191 string value: 0.077248632465519
我正在尝试实现一个使用 128 位 key 的密码。 key 计划的一部分是将 key 向右旋转 29 位,但我不确定该怎么做,因为 Java 中没有单一数据类型可以保存整个 key 。我将它存储在两
我正在尝试在 AVX2 中对 128 位数进行左旋转。由于没有直接的方法,我尝试使用左移和右移来完成我的任务。 这是我执行相同操作的代码片段。 l = 4; r = 4
我有一个 int,它的值类似于 1235 和 12890。我只想要这个 int 的前 2 位数字。我怎样才能提取它? 想了半天,想不出什么办法。 最佳答案 减少数字,直到只剩下两位数: while (
TL:DR 我想要紧跟“+”符号的任何行上的前两个数字的语法。 给定以下文本(来自熟悉的实用程序): power_meter-acpi-0 Adapter: ACPI interface power1
因此根据 cplusplus.com,当您通过以下方式将输出流的格式标志设置为科学记数法时 of.setf(ios::scientific) 您应该在指数中看到 3 位加号和一个符号。但是,我的输出似
这个问题在这里已经有了答案: How can I pad a value with leading zeros? (77 个答案) 关闭 9 年前。 如果小时数小于 10 小时,则小时数通常以个位数
我正在使用 moment.js使用根据距离/速度计算的日期时间。我也在使用 moment duration format plugin .当我将值传递给 moment.duration 然后对其进行格
我正在将一个应用程序从 .NET 移植到 Mono 运行时,并且在代码中的某个位置我可以看到一个 float 具有值 158136.422。我对 float 的理解是它是 7 位精度,那么这个数字如何
我是一名优秀的程序员,十分优秀!