优化算法以在`uint64_t`字中找到零位

时间:2017-11-23 06:26:13

标签: bit-manipulation

我需要跟踪64K项目的免费/使用状态。我的计划是使用import React, { Component } from "react"; import * as Animated from "animated/lib/targets/react-dom"; const AnimatedWrapper = WrappedComponent => class AnimatedWrapper extends Component { constructor(props) { super(props); } componentDidMount() { console.log('mount'); } componentWillAppear() { console.log('appear'); } componentWillEnter() { console.log('enter'); } componentWillLeave() { console.log('leave'); } render() { return ( <Animated.div className="animated-page-wrapper"> </Animated.div> ); } }; export default AnimatedWrapper; 代表项目的每个位。我会在项目正在使用时设置相应的位,并在空闲时重置。

为了找到一个空闲插槽,我可以逐个扫描数组并找到一个未设置的位,这是天真的和最慢的。一级优化是跳过已满的单词。即值为max_int(uint64_t array[1000])的项目。

我正在寻找进一步优化此功能的方法,以便我可以在最少的操作数量中找到空闲插槽。

谢谢!

1 个答案:

答案 0 :(得分:1)

由于数字中有64位,扫描 log 2 64 = 6次就足够了:

int findZeroBit(uint64_t n){
int index = 0;
n = ~n;
if (n & 0xFFFFFFFF00000000) index += 32;
if (n & 0xFFFF0000FFFF0000) index += 16;
if (n & 0xFF00FF00FF00FF00) index += 8;
if (n & 0xF0F0F0F0F0F0F0F0) index += 4;
if (n & 0xCCCCCCCCCCCCCCCC) index += 2;
if (n & 0xAAAAAAAAAAAAAAAA) index += 1;
return index;
}

但是只会返回一位。