我已经看到了关于计算insert type of输入中设置位数的众多问题,但为什么它有用呢?
对于那些寻找有关位计数的算法的人,请看这里:
language-agnostic computer-science bits bit-manipulation bitcount
我有一个长度为8的二进制数,例如00110101设置了8位.我需要一个快速位计数来确定设置位数.像x = x&(x-1)那样运行算法会将它限制为包含数字中的设置位数但是我不太确定如何使用它.一点帮助就会明显!
以下是std::bitset::countMSVC 2010 的实现:
size_t count() const
{ // count number of set bits
static char _Bitsperhex[] = "\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4";
size_t _Val = 0;
for (int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
for (_Ty _Wordval = _Array[_Wpos]; _Wordval != 0; _Wordval >>= 4)
_Val += _Bitsperhex[_Wordval & 0xF];
return (_Val);
}
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释这是如何工作的吗?诀窍是_Bitsperhex什么?
可能重复:
查找连续的位串1或0
是否有可能从左数开始计算整数中的连续1?所以:从最高位开始的连续设置位的总数.
仅使用:
! ~ & ^ | + << >>
Run Code Online (Sandbox Code Playgroud)
-1= 0xFFFFFFFF将返回32
0xFFF0F0F0 将返回12(FFF = 111111111111)
不幸的是没有循环.
可以承担机器:
使用2s补码,32位整数表示.
算术地进行右移.
将整数移位超过字大小时,会出现不可预测的行为.
我被禁止:
使用任何控制结构,如if,do,while,for,switch等.
定义或使用任何宏.
在此文件中定义任何其他功能.
调用任何功能.
使用任何其他操作,例如&&,||, - 或?:
使用任何形式的铸造.
使用除int之外的任何数据类型.这意味着您不能使用数组,结构或联合.
我看过 Finding连续的1位或0位字符串 它是使用循环,我无法使用.我甚至不知道从哪里开始.
(是的,这是一项任务,但我只是要求那些熟练的人帮忙.我已经完成了所有我需要做的事情,但是这个不会起作用.)
(对于那些仅仅因为它是为了学校而贬低的人:常见问题:1一个特定的编程问题,检查2但是,如果你的动机是"我希望别人向我解释______",那么你可能没问题.)
我只是想在php中找到一些最快的设置位计数功能.
例如,0010101 => 3,00011110 => 4
我看到有很好的算法可以在c ++中实现. 如何计算32位整数中的设置位数?
是否有任何php内置函数或最快的用户自定义函数?
如果我有long long x;c ++
如何循环数字中的每个位以检查它是零还是1?
我想计算位数的数量.
我似乎无法在此找到任何有点魔力,所以我希望这里的某人可能能够揭示这是否可能.
我试图在8位整数中找到按位转换的数量(整数实际上是32位整数,但我只使用前8位)来确定8位是否均匀(2个或更少的转换) ).
例如:
00100000 - two transitions - uniform
00100001 - three transitions - not uniform
10101010 - seven transitions - not uniform
00000000 - no transitions - uniform
Run Code Online (Sandbox Code Playgroud)
是否有更快的方法来找到除了循环每个位之外的转换次数(循环通过每个位是目前唯一可以提出的解决方案)?
假设我们有K个二进制数(每个都是相同的长度).我们需要找到所需的最少位数(不需要是连续的)来唯一地识别这些K二进制数.例如100,110可以区分1位(在第二位置).111,110,101需要2比特来区分.
我搜索了一种算法,该算法通过 O(1) 的时间复杂度以及我在谷歌中找到的内容来计算 Byte 中的个数:
// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
int BitsSetTable256[256];
// Function to initialise the lookup table
void initialize()
{
// To initially generate the
// table algorithmically
BitsSetTable256[0] = 0;
for (int i = 0; i < 256; i++)
{
BitsSetTable256[i] = (i & 1) +
BitsSetTable256[i / 2];
}
}
// Function to return the count
// of set bits in n
int countSetBits(int n)
{
return (BitsSetTable256[n & 0xff] …Run Code Online (Sandbox Code Playgroud)