相关疑难解决方法(0)

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

代表数字7的8位看起来像这样:

00000111
Run Code Online (Sandbox Code Playgroud)

设置三位.

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

algorithm binary bit-manipulation hammingweight iec10967

838
推荐指数
31
解决办法
52万
查看次数

Python中正整数的位长度

1 = 0b1 -> 1
5 = 0b101 -> 3
10 = 0b1010 -> 4
100 = 0b1100100 -> 7
1000 = 0b1111101000 -> 10
…
Run Code Online (Sandbox Code Playgroud)

如何获得整数的位长度,即在Python中表示正整数所需的位数?

python bits bitcount

42
推荐指数
4
解决办法
6万
查看次数

.NET相当于Java的Integer.bitCount?

是否有类似于Java的方法Integer.bitCount(int)Long.bitCount(long).NET Framework中的任何位置?

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

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

虽然 很多 实现 ,以 发现在网络上,我在想,如果有一个标准库的实现.

我知道这不在BitArray,UInt32或者BitConverter,但也许有一个版本隐藏在某处,例如在加密功能中.

.net java bit-manipulation hammingweight

15
推荐指数
3
解决办法
1780
查看次数

Python:设置位数(popcount)

我的数据库(oracle 11g)中很少有blob被复制,使用UTL_RAW.BIT_XOR对blob执行XOR操作.之后我想计算二进制字符串中的设置位数,所以写了上面的代码.

在一个小实验中,我想看看生成的十六进制和整数值是什么,并编写了这个程序.

SQL> declare
2
3 vblob1 blob;
4
5 BEGIN
6
7 select leftiriscode INTO vblob1 FROM irisdata WHERE irisid=1;
8
9 dbms_output.put_line(rawtohex(vblob1));
10
11
12 dbms_output.put_line(UTL_RAW.CAST_TO_binary_integer(vblob1));
13
14
15 END;
16 /
Run Code Online (Sandbox Code Playgroud)

输出:HEXVALUE:

0F0008020003030D030C1D1C3C383C330A3311373724764C54496C0A6B029B84840547A341BBA83D
BB5FB9DE4CDE5EFE96E1FC6169438344D604681D409F9F9F3BC07EE0C4E0C033A23B37791F59F84F
F94E4F664E3072B0229DA09D9F0F1FC600C2E380D6988C198B39517D157E7D66FE675237673D3D28
3A016C01411003343C76740F710F0F4F8FE976E1E882C186D316A63C0C7D7D7D7D397F016101B043
0176C37E767C7E0C7D010C8302C2D3E4F2ACE42F8D3F3F367A46F54285434ABB61BDB53CBF6C7CC0
F4C1C3F349B3F7BEB30E4A0CFE1C85180DC338C2C1C6E7A5CE3104303178724CCC5F451F573F3B24
7F24052000202003291F130F1B0E070C0E0D0F0E0F0B0B07070F1E1B330F27073F3F272E2F2F6F7B
2F2E1F2E4F7EFF7EDF3EBF253F3D2F39BF3D7F7FFED72FF39FE7773DBE9DBFBB3FE7A76E777DF55C
5F5F7ADF7FBD7F6AFE7B7D1FBE7F7F7DD7F63FBFBF2D3B7F7F5F2F7F3D7F7D3B3F3B7FFF4D676F7F
5D9FAD7DD17F7F6F6F0B6F7F3F767F1779364737370F7D3F5F377F2F3D3F7F1F2FE7709FB7BCB77B
0B77CF1DF5BF1F7F3D3E4E7F197F571F7D7E3F7F7F7D7F6F4F75FF6F7ECE2FFF793EFFEDB7BDDD1F
FF3BCE3F7F3FBF3D6C7FFF7F7F4FAF7F6FFFFF8D7777BF3AE30FAEEEEBCF5FEEFEE75FFEACFFDF0F
DFFFF77FFF677F4FFF7F7F1B5F1F5F146F1F1E1B3B1F3F273303170F370E250B

INTEGER VALUE: 15
Run Code Online (Sandbox Code Playgroud)

十六进制代码和生成的整数值之间存在差异,因此使用以下python代码检查实际的整数值.

print int("0F0008020003030D030C1D1C3C383C330A3311373724764C54496C0A6B029B84840547A341BBA83D
BB5FB9DE4CDE5EFE96E1FC6169438344D604681D409F9F9F3BC07EE0C4E0C033A23B37791F59F84F
F94E4F664E3072B0229DA09D9F0F1FC600C2E380D6988C198B39517D157E7D66FE675237673D3D28
3A016C01411003343C76740F710F0F4F8FE976E1E882C186D316A63C0C7D7D7D7D397F016101B043
0176C37E767C7E0C7D010C8302C2D3E4F2ACE42F8D3F3F367A46F54285434ABB61BDB53CBF6C7CC0
F4C1C3F349B3F7BEB30E4A0CFE1C85180DC338C2C1C6E7A5CE3104303178724CCC5F451F573F3B24
7F24052000202003291F130F1B0E070C0E0D0F0E0F0B0B07070F1E1B330F27073F3F272E2F2F6F7B
2F2E1F2E4F7EFF7EDF3EBF253F3D2F39BF3D7F7FFED72FF39FE7773DBE9DBFBB3FE7A76E777DF55C
5F5F7ADF7FBD7F6AFE7B7D1FBE7F7F7DD7F63FBFBF2D3B7F7F5F2F7F3D7F7D3B3F3B7FFF4D676F7F
5D9FAD7DD17F7F6F6F0B6F7F3F767F1779364737370F7D3F5F377F2F3D3F7F1F2FE7709FB7BCB77B
0B77CF1DF5BF1F7F3D3E4E7F197F571F7D7E3F7F7F7D7F6F4F75FF6F7ECE2FFF793EFFEDB7BDDD1F
FF3BCE3F7F3FBF3D6C7FFF7F7F4FAF7F6FFFFF8D7777BF3AE30FAEEEEBCF5FEEFEE75FFEACFFDF0F
DFFFF77FFF677F4FFF7F7F1B5F1F5F146F1F1E1B3B1F3F273303170F370E250B",16)
Run Code Online (Sandbox Code Playgroud)

回答:

611951595100708231079693644541095422704525056339295086455197024065285448917042457
942011979060274412229909425184116963447100932992139876977824261789243946528467423
887840013630358158845039770703659333212332565531927875442166643379024991542726916
563271158141698128396823655639931773363878078933197184072343959630467756337300811
165816534945075483141582643531294791665590339000206551162697220540050652439977992
246472159627917169957822698172925680112854091876671868161705785698942483896808137
210721991100755736178634253569843464062494863175653771387230991126430841565373390
924951878267929443498220727531299945275045612499928105876210478958806304156695438
684335624641395635997624911334453040399012259638042898470872203581555352191122920
004010193837249388365999010692555403377045768493630826307316376698443166439386014
145858084176544890282148970436631175577000673079418699845203671050174181808397880
048734270748095682582556024378558289251964544327507321930196203199459115159756564 …
Run Code Online (Sandbox Code Playgroud)

python bit-manipulation

13
推荐指数
4
解决办法
2万
查看次数

二进制numpy数组之间的快速汉明距离计算

我有两个相同长度的numpy数组包含二进制值

import numpy as np
a=np.array([1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0])
b=np.array([1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1])
Run Code Online (Sandbox Code Playgroud)

我想尽可能快地计算它们之间的汉明距离,因为我有数以百万计的这样的距离计算.

一个简单但缓慢的选择(取自维基百科):

%timeit sum(ch1 != ch2 for ch1, ch2 in zip(a, b))
10000 loops, best of 3: 79 us per loop
Run Code Online (Sandbox Code Playgroud)

我已经提出了更快的选项,灵感来自堆栈溢出的一些答案.

%timeit np.sum(np.bitwise_xor(a,b))
100000 loops, best of 3: 6.94 us per loop …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy cython hamming-distance

8
推荐指数
3
解决办法
9807
查看次数

为什么在我的情况下 For 循环比 Map、Reduce 和 List 理解更快

我写了一个简单的脚本来测试速度,这就是我发现的。实际上 for 循环在我的情况下是最快的。这真的让我感到惊讶,请查看下面的内容(正在计算平方和)。那是因为它在内存中保存了列表还是有意为之?任何人都可以解释这一点。

from functools import reduce
import datetime


def time_it(func, numbers, *args):
    start_t = datetime.datetime.now()
    for i in range(numbers):
        func(args[0])
    print (datetime.datetime.now()-start_t)

def square_sum1(numbers):
    return reduce(lambda sum, next: sum+next**2, numbers, 0)


def square_sum2(numbers):
    a = 0
    for i in numbers:
        i = i**2
        a += i
    return a

def square_sum3(numbers):
    sqrt = lambda x: x**2
    return sum(map(sqrt, numbers))

def square_sum4(numbers):
    return(sum([i**2 for i in numbers]))


time_it(square_sum1, 100000, [1, 2, 5, 3, 1, 2, 5, 3])
time_it(square_sum2, 100000, [1, 2, …
Run Code Online (Sandbox Code Playgroud)

python performance for-loop mapreduce list-comprehension

4
推荐指数
1
解决办法
3739
查看次数

获取 python Long 对象中 1 位的位置

假设我在 python 2.7 中有一个非常非常大的 python 整数(尽管如果需要,我不介意切换到 python 3)。

比 2^100000 更大的东西。

找到二进制序列中全 1 的位置的最快方法是什么?(例如:24 就是 11000 ---> = [4,5] (或 [5,4].. 我不关心顺序)

目前我正在使用:

sum = whatever_starting_number

while 1:
    val = sum.bit_length()-1
    sum -= 2**val
    mylist.append(val)
    if sum == 0:
        break
Run Code Online (Sandbox Code Playgroud)

这没关系,但它比仅仅取 log2 并重复减去它还快。我实际上想做的只是查看位,跳过零,记录1的位置,甚至不需要修改原始值。

编辑:得到多个答案,真的很感激。我将在几个 timeit 测试中实现它们,并将在明天更新结果。

python binary bit-manipulation bitwise-operators

3
推荐指数
2
解决办法
4436
查看次数

numpy矢量化方法来计算整数数组中的非零位

我有一个整数数组:

[int1, int2, ..., intn]
Run Code Online (Sandbox Code Playgroud)

我想计算这些整数的二进制表示中有多少非零位。

例如:

bin(123) -> 0b1111011, there are 6 non-zero bits
Run Code Online (Sandbox Code Playgroud)

当然,我可以遍历整数、用途bin()count('1')函数的列表,但我正在寻找矢量化的方法来做到这一点。

python arrays numpy vectorization

3
推荐指数
2
解决办法
170
查看次数

python中的函数模板

我想知道如何在 python 中使用与模板 < typename T>类似的代码,因为它在 C++ 代码示例中使用:

template <typename T>
unsigned int counting_bit(unsigned int v){
   v = v - ((v >> 1) & (T)~(T)0/3);                           // temp
   v = (v & (T)~(T)0/15*3) + ((v >> 2) & (T)~(T)0/15*3);      // temp
   v = (v + (v >> 4)) & (T)~(T)0/255*15;                      // temp
   return v;
}
Run Code Online (Sandbox Code Playgroud)

我将如何在 python 中以与 C++ 中提到的相同的方式使用变量 typename 类型转换对象?

c++ python templates function-templates

2
推荐指数
2
解决办法
7424
查看次数

如何计算数字的设置位总数

  • 给定一个正整数 A,任务是计算从 1 到 A 的所有数字的二进制表示中设置位的总数。
 A = 3
 DECIMAL    BINARY  SET BIT COUNT
    1          01        1
    2          10        1
    3          11        2
Run Code Online (Sandbox Code Playgroud)

1 + 1 + 2 = 4

  • 我得到了正确的输出

代码如下

def solve(A):
     ad = ''
     for i in range(A + 1):
         ad += str(bin(i).replace('ob',''))
     return ad.count('1')
Run Code Online (Sandbox Code Playgroud)

使用按位

  def solve(A):
        count = 0
        for i in range(A + 1):
            while i > 0:
                i= i & (i-1)
                count += 1
        return (count)
Run Code Online (Sandbox Code Playgroud)
  • 在这两种情况下,我都得到 Time Limit Exceeded.

python time-complexity

2
推荐指数
1
解决办法
107
查看次数

Python:如何有效地计算1到n数字的二进制表示中"1"的数量?

例如,对于输入5,输出应为7.(bin(1)= 1,bin(2)= 10 ... bin(5)= 101) - > 1 + 1 + 2 + 1 + 2 = 7

这是我尝试过的,但它不是一个非常有效的算法,考虑到我为每个整数迭代一次循环.我的代码(Python 3):

i = int(input())
a = 0
for b in range(i+1):
  a = a + bin(b).count("1")
print(a)
Run Code Online (Sandbox Code Playgroud)

谢谢!

python algorithm

1
推荐指数
1
解决办法
84
查看次数