惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - Franky
MyScale Blog
MyScale Blog
A
About on SuperTechFans
博客园_首页
B
Blog RSS Feed
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
C
Check Point Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 【当耐特】
M
MIT News - Artificial intelligence
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
I
InfoQ
罗磊的独立博客

博客园 - hzwang

Administering your Windows Internal Database (MICROSOFT##SSEE) instance(转) VS 2008如何连接TFS 2010 learning F#(1):编程环境 learning F#: 开篇 Tip for using Fiddler on localhost (转载)ASP.NET MVC – Add CSS class Attribute I will write at least one blog every week 对象判等 sql bcp Utility工具使用 C# 3.0 —— 扩展方法 读代码随笔(一):using语句的使用 visitor(访问者)模式 - hzwang - 博客园 抽象类与接口(转) 在 C# 中实现 Singleton (转) 设置VSS2005使支持通过Internet访问 VSS使用手册 ASP.NET Forms 身份验证控制流 Cookie使用总结 不断努力,不断学习
使用位逻辑运算来实现位向量
hzwang · 2009-07-29 · via 博客园 - hzwang

使用位逻辑运算来实现位向量,指的是实现位向量的设置、清零、探测三个操作。

代码如下:

private const int bitsPerWord = 32;
private const int shift = 5;
private const int mask = 0x1F;
private const int n = 10000000;
private static readonly int[] a = new int[1 + n / bitSperWord];

void set(int i)
{
    a[i >> shift] |= (1 << (i & mask));
}
void clr(int i)
{
    a[i >> shift] &= ~(1 << (i & mask));
}
int test(int i)
{
    return a[i >> shift] & (1 << (i & mask));
}

我们实现的功能是,给定一个整型(32位)数组,我们输入一个参数i,然后设置数组的i位是1,或是对第i位清零,或是探测第i位的值。

这段代码中使用了太量的位逻辑运算,并不是很好看懂。

i >> shift
这个其实就是把i除以32,也就是2^5。目的是找出i应该数组中的哪个位置。

1<<(i & mask)
i & mask首先算出应该向左移动的位数,然后把1向左移动这么多位,剩下的就是和数组中的那个元素或者与运算,或者或运算了。

其实把这几句改成这样更好理解些。

void set(int i)
{
    a[i / 32] |= (1 << (i % 32));
}
void clr(int i)
{
    a[i / 32] &= ~(1 << (i % 32));
}
int test(int i)
{
    return a[i / 32] & (1 << (i % 32));
}

位向量在某些特定的海量数据处理应用中(像查找,排序之类),有很好的性能及内存优势。