Binary 按32位二进制数数组的位置(位置)计数个数
给出了一个32位二进制数的Binary 按32位二进制数数组的位置(位置)计数个数,binary,bit-manipulation,Binary,Bit Manipulation,给出了一个32位二进制数的数组(10^5大小),我们需要计算这些数字中每一位的二进制数 例如: Array : {10101,1011,1010,1} Counts : {1's place: 3, 2's place: 2, 3's place: 1, 4's place: 2, 5's place: 1} 在我看来,没有一种比特操作技术能够满足这些限制 这应该可以通过两个循环来解决:一个循环遍历数组,另一个屏蔽正确的位。对于您的约束,运行时间应该不会太糟糕 下面是一个rust实现
数组(10^5大小)
,我们需要计算这些数字中每一位的二进制数
例如:
Array : {10101,1011,1010,1}
Counts : {1's place: 3, 2's place: 2, 3's place: 1, 4's place: 2, 5's place: 1}
在我看来,没有一种比特操作技术能够满足这些限制 这应该可以通过两个循环来解决:一个循环遍历数组,另一个屏蔽正确的位。对于您的约束,运行时间应该不会太糟糕 下面是一个rust实现(出自我的头脑,未经过全面测试):
fn main(){
让mut v=vec!();
对于1..50*1000中的i{
v、 推(i);
}
设r=bitcount\u arr(v);
r、 iter().enumerate().for|u each(|(i,x)| print!({}:{},i+1,x));
}
fn位计数\u arr(输入:Vec)->[u32;32]{
设mut res=[0;32];
对于输入中的num{
因为我在0..31{
让mask=1这可以通过转置加法完成,尽管数组有点长
若要转置加法,请使用一个计数器数组,但不是每个位置使用一个计数器,而是每个计数位使用一个计数器。因此,一个计数器跟踪每个位置的计数是否为偶数/奇数,一个计数器跟踪每个位置的计数是否为2,等等
要将数组的一个元素添加到此中,只需要一半的add操作(&
查找新进位,^
更新),因为它只是一个条件增量:(未测试)
uint32_t计数器[17];
用于(uint32元素:阵列){
uint32_t c=元素;
对于(int i=0;i<17;i++){
uint32\u t nextcarry=计数器[i]&c;
计数器[i]^=c;
c=下一个日历;
}
}
我选择17个计数器是因为log2(10^5)
刚好小于17。所以即使所有位都是1,计数器也不会换行
要读取位k
的结果,请取每个计数器的k
第位
有一些更有效的方法可以使用一些完整的加法和复制计数器将数组的多个元素一次添加到计数器中
fn main() {
let mut v = vec!();
for i in 1..50*1000 {
v.push(i);
}
let r = bitcount_arr(v);
r.iter().enumerate().for_each( |(i,x)| print!("index {}:{} ",i+1,x));
}
fn bitcount_arr(input:Vec<u32>) -> [u32;32] {
let mut res = [0;32];
for num in input {
for i in 0..31 {
let mask = 1 << i;
if num & mask != 0 {
res[i] += 1;
}
}
}
res
}
uint32_t counters[17];
for (uint32_t elem : array) {
uint32_t c = elem;
for (int i = 0; i < 17; i++) {
uint32_t nextcarry = counters[i] & c;
counters[i] ^= c;
c = nextcarry;
}
}