Tag: 位操作

将0x1234转换为0x11223344

如何以高性能的方式将hex数0x1234扩展到0x11223344? unsigned int c = 0x1234, b; b = (c & 0xff) << 4 | c & 0xf | (c & 0xff0) << 8 | (c & 0xff00) << 12 | (c & 0xf000) << 16; printf("%p -> %p\n", c, b); 输出: 0x1234 -> 0x11223344 我需要这个颜色转换。 用户以0xARGB的forms提供他们的数据,我需要将其转换为0xAARRGGBB 。 是的,可能有数百万,因为每个可能是一个像素。 1000×1000像素等于一百万。 实际情况更加复杂,因为一个32位值包含前景色和背景色。 所以0xARGBargb变成: [ 0xAARRGGBB, 0xaarrggbb […]

开发人员应该知道哪些有用的按位运算符代码技巧?

我必须说我从来没有理由使用按位运算符,但是我确信有一些我已经执行的操作可以更有效地完成它们。 如何“转移”和“OR-ing”帮助您更有效地解决问题?

什么是按位移(左或右)做什么和它用于什么?

我已经看到了我所看到的各种代码中的运算符>>和<< (我其实都没有理解),但是我只是想知道他们实际上做了什么以及它们的实际用途是什么。 编辑 如果这些变化像x * 2和x / 2 ,实际使用*和/操作符有什么实际的区别? 是否有性能差异?

以64位整数或相邻位的有效方法

我想要做的是取一个由比特对组成的64位无符号整数,并从中创build一个包含0的32位整数,如果相应对中的两个比特都是0,否则为1。 换句话说,转换看起来像这样的东西: 01 00 10 11 变成看起来像这样的东西 1 0 1 1 两个明显的解决scheme是蛮力循环或每个字节的查找表,然后做八个查找,并将它们结合成OR和位移的最终结果,但我相信应该有一个有效的方式。 我将这样做的C + + 64位整数,但如果有人知道有效的方式来做这个更短的整数,我相信我可以弄清楚如何扩展它。

快速生成每个比特具有0或1的概率的伪随机比特的方法

通常,一个随机数发生器返回一个位stream,在每个位置观察0或1的概率是相等的(即50%)。 我们称之为一个公正的PRNG。 我需要生成一串具有以下属性的伪随机比特:在每个位置上看到1的概率是p(即看到0的概率是1-p)。 参数p是0到1之间的实数; 在我的问题中它恰好有0.5%的分辨率,即它可以取值0%,0.5%,1%,1.5%,…,99.5%,100%。 请注意,p是一个概率,而不是一个确切的分数。 在n位数据stream中设置为1的实际位数必须遵循二项式分布B(n,p)。 有一种天真的方法,可以使用无偏PRNG来生成每个位的值(伪代码): generate_biased_stream(n, p): result = [] for i in 1 to n: if random_uniform(0, 1) < p: result.append(1) else: result.append(0) return result 这样的实现比产生无偏stream的实现要慢得多,因为它每位调用一次随机数生成器函数; 而无偏stream生成器每个字大小调用一次(例如,一次调用就可以产生32或64个随机位)。 我想要一个更快的实现,即使它稍微牺牲随机性。 想到一个想法是预先计算一个查找表:对于p的200个可能的值中的每一个,使用较慢的algorithm计算C 8位值并将它们保存在表中。 然后快速algorithm将随机select其中的一个来产生8个偏斜位。 在包络计算的后面,看看需要多less内存:C应该至less为256(可能的8位值的数量),可能更多是为了避免采样效应; 假设1024.也许这个数字应该取决于p,但是让我们保持简单,并说平均值是1024.因为有200个值=>总的内存使用量是200 KB。 这并不坏,可能适合二级caching(256 KB)。 我仍然需要评估它是否存在引入偏差的抽样效应,在这种情况下,C必须增加。 这个解决scheme的不足之处在于,它只能一次产生8位数据,即使有很多工作也是如此,而一个无偏PRNG只需要一些算术指令就可以产生64个数据。 我想知道是否有一个更快的方法,基于位操作,而不是查找表。 例如直接修改随机数生成代码,为每一位引入一个偏差。 这将达到与无偏见的PRNG相同的性能。 3月5日编辑 谢谢大家的build议,我有很多有趣的想法和build议。 这里是最重要的: 更改问题要求,以便p的分辨率为1/256而不是1/200。 这允许更有效地使用比特,并且还提供了更多优化的机会。 我想我可以做这个改变。 使用算术编码来高效地消耗来自无偏置发生器的比特。 随着上述分辨率的变化,这变得更容易。 有less数人认为PRNG速度非常快,因此使用算术编码可能会导致代码变慢,这是由于引入的开销。 相反,我应该总是消耗最坏情况的位数并优化代码。 […]

最简单的方法来检查两个整数是否有相同的符号?

检查两个整数是否具有相同符号的最简单方法是什么? 有没有什么简单的button技巧来做到这一点?

在字节中设置特定位

我试图在Java字节variables中设置位。 它确实提供了像.setBit(i)这样的propper方法。 有人知道我怎么能意识到这一点? 我可以遍历一个给定的字节: if( (my_byte & (1 << i)) == 0 ){ } 但是我不能把这个位置设置为1或0,对吗?

在C ++中testing一个数是否是2的幂的最简单的方法是什么?

我需要这样的function: // return true iff 'n' is a power of 2, eg // is_power_of_2(16) => true is_power_of_2(3) => false bool is_power_of_2(int n); 任何人都可以build议我怎么写这个? 你能告诉我一个很好的网站,这种algorithm可以find?

什么是CHAR_BIT?

从http://graphics.stanford.edu/~seander/bithacks.html引用无分支计算整数绝对值(abs)的代码: int v; // we want to find the absolute value of v unsigned int r; // the result goes here int const mask = v >> sizeof(int) * CHAR_BIT – 1; r = (v + mask) ^ mask; 获得专利的变体: r = (v ^ mask) – mask; 什么是CHAR_BIT以及如何使用它?

如何从C中的整数值获取逐位数据?

我想提取一个十进制数的位。 例如,7是二进制0111,我想要得到0 1 1 1存储在布尔中的所有位。 我怎么能这样做? 好的,循环不是一个好的select,我可以为此做点什么吗?