标签: bit-manipulation

是否比Java中的乘法和除法更快地移位?.净?

如果您恰好使用2的幂,则左右移位显然比大多数甚至所有CPU上的乘法和除法运算更快.但是,它可能会降低某些读取器和某些算法的代码清晰度.位移对于性能是否真的是必要的,或者我可以期望编译器或VM注意到这种情况并对其进行优化(特别是当2的幂是文字时)?我主要对Java和.NET行为感兴趣,但欢迎深入了解其他语言实现.

.net c# java optimization bit-manipulation

64
推荐指数
7
解决办法
3万
查看次数

按位移位(左或右)做什么以及它用于什么?

我已经看过运算符>>和我看过的<<各种代码(我实际上并没有理解),但我只是想知道它们实际上做了什么以及它们的实际用途是什么.

编辑

如果移位是喜欢x * 2x / 2,就是从实际使用的真正的区别*/运营商?有性能差异吗?

bit-manipulation bit-shift bitwise-operators

63
推荐指数
5
解决办法
11万
查看次数

开发人员应该了解哪些有用的按位操作符代码?

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

language-agnostic bit-manipulation bit

62
推荐指数
5
解决办法
3万
查看次数

Android In App Billing:保护应用程序公钥

来自Android In App Billing版本3(TrivialDrive)的示例应用程序随附sdk

MainActivity.java

/* base64EncodedPublicKey should be YOUR APPLICATION'S PUBLIC KEY
 * (that you got from the Google Play developer console). This is not your
 * developer public key, it's the *app-specific* public key.
 *
 * Instead of just storing the entire literal string here embedded in the
 * program,  construct the key at runtime from pieces or
 * use bit manipulation (for example, XOR with some other string) to hide
 * the actual key.  The key itself …
Run Code Online (Sandbox Code Playgroud)

security android bit-manipulation public-key in-app-billing

61
推荐指数
3
解决办法
2万
查看次数

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

检查两个整数是否具有相同符号的最简单方法是什么?这有什么简单的按位技巧吗?

integer bit-manipulation sign

60
推荐指数
7
解决办法
4万
查看次数

理解PHP&(&符号,按位和)运算符

我经常($var & 1)在我的代码中使用,如果$var是奇数则返回true,如果是偶数则返回false.

但"&"究竟做了什么?

php bit-manipulation operators bitwise-operators

60
推荐指数
5
解决办法
3万
查看次数

在两个大整数的乘法期间捕获并计算溢出

我正在寻找一种有效(可选的标准,优雅且易于实现)的解决方案来乘以相对较大的数字,并将结果存储为一个或多个整数:

假设我有两个64位整数,如下所示:

uint64_t a = xxx, b = yyy; 
Run Code Online (Sandbox Code Playgroud)

当我这样做时a * b,如何检测操作是否导致溢出,并且在这种情况下将进位存储在某处?

请注意,我不想使用任何大号库,因为我对存储数字的方式有限制.

c integer bit-manipulation overflow multiplication

60
推荐指数
6
解决办法
5万
查看次数

Python的两个补充

python中是否有内置函数将二进制字符串(例如'111111111111')转换为二进制补码整数 -1?

python bit-manipulation twos-complement

58
推荐指数
6
解决办法
10万
查看次数

57
推荐指数
4
解决办法
4万
查看次数

快速生成每个位的给定概率为0或1的伪随机位

通常,随机数发生器返回比特流,对于该比特流,在每个位置观察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比特流中设置为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
Run Code Online (Sandbox Code Playgroud)

这种实现比生成无偏流的实现要慢得多,因为它每个位调用一次随机数生成器函数; 而无偏流生成器每字大小调用一次(例如,它可以通过一次调用生成32或64个随机位).

我想要更快的实现,即使它稍微牺牲了随机性.想到的一个想法是预先计算查找表:对于p的200个可能值中的每一个,使用较慢的算法计算C 8位值并将它们保存在表中.然后快速算法将随机选择其中一个以生成8个偏斜位.

包络计算的背面,以查看需要多少内存:C应至少为256(可能的8位值的数量),可能更多以避免采样效果; 比方说,1024也许数量应具体取决于p各不相同,但让我们保持它的简单,说平均为1024由于是p的200个值=>总内存为200 KB.这不错,可能适合L2缓存(256 KB).我仍然需要对它进行评估,以确定是否存在引入偏差的采样效应,在这种情况下,必须增加C.

该解决方案的不足之处是,它可以一次生成只有8位,甚至有大量的工作,而一个不带偏见PRNG可以生成64只有几个算术指令一次.

我想知道是否有一种更快的方法,基于位操作而不是查找表.例如,直接修改随机数生成代码以为每个位引入偏差.这将实现与无偏PRNG相同的性能.


编辑3月5日

谢谢大家的建议,我收到了很多有趣的想法和建议.以下是最重要的:

  • 更改问题要求,使p的分辨率为1/256而不是1/200.这允许更有效地使用比特,并且还提供更多优化机会.我想我可以做出这个改变.
  • 使用算术编码有效地消耗来自无偏生成器的位.通过上述分辨率的变化,这变得更容易.
  • 一些人认为PRNG非常快,因此使用算术编码实际上可能会因为引入的开销而使代码变慢.相反,我应该总是消耗最坏情况下的位数并优化该代码.请参阅下面的基准.
  • @rici建议使用SIMD.这是个好主意,只有在我们总是消耗固定数量的位时才有效.

基准(无算术解码)

注意:正如你们许多人建议的那样,我将分辨率从1/200更改为1/256.

我写了几个朴素方法的实现,只需要8个随机无偏位并生成1个偏置位:

我使用两个无偏的伪随机数生成器:

我还测量了无偏PRNG的速度以进行比较.结果如下:


RNG: Ranvec1(Mersenne Twister for Graphics Processors + Multiply with Carry)

Method: Unbiased with 1/1 efficiency, SIMD=vectorclass (incorrect, baseline)
Gbps/s: 16.081 …
Run Code Online (Sandbox Code Playgroud)

c c++ random algorithm bit-manipulation

57
推荐指数
10
解决办法
4571
查看次数