以下哪种技术是将整数除以2的最佳选择,为什么?
技巧1:
x = x >> 1;
Run Code Online (Sandbox Code Playgroud)
技术2:
x = x / 2;
Run Code Online (Sandbox Code Playgroud)
这x是一个整数.
给定std::bitset<64> bits任意数量的位和位位置X(0-63)
在X位或更低位计数位的最有效方法是什么,如果未设置X位,则返回0
注意:如果设置该位,则返回始终至少为1
蛮力方式很慢:
int countupto(std::bitset<64> bits, int X)
{
if (!bits[X]) return 0;
int total=1;
for (int i=0; i < X; ++i)
{
total+=bits[i];
}
return total;
}
Run Code Online (Sandbox Code Playgroud)
这个count()方法bitset将为您popcount提供所有位,但bitset不支持范围
注意:这不是如何计算32位整数中的设置位数?因为它询问所有位而不是0到X的范围
由于x86的C编译器(即GCC和锵)的进步,这被认为提高效率许多编码做法已不再使用,因为编译器能够做得更好优化比人类的代码(例如位移位与乘法).
这些具体做法是什么?
我最近了解到整数溢出是C中未定义的行为(侧面问题 - 它是否也是C++中的UB?)
经常在C语言编程,你需要找到两个值的平均值a和b.但是,这样做(a+b)/2会导致溢出和未定义的行为.
所以我的问题是-什么是找到两个值的平均值的正确方法a,并b用C?
在可能的情况下,我想知道用一个bitshift替换单个乘法后跟一个整数除法是否更快.说我有一个int k,我想将它乘以2.25.
什么更快?
int k = 5;
k *= 2.25;
std::cout << k << std::endl;
Run Code Online (Sandbox Code Playgroud)
要么
int k = 5;
k = (k<<1) + (k/4);
std::cout << k << std::endl;
Run Code Online (Sandbox Code Playgroud)
产量
11
11
Run Code Online (Sandbox Code Playgroud)
两者都给出了相同的结果,你可以查看这个完整的例子.
在一些旧的C/C++图形相关代码中,我必须移植到Java和JavaScript,我发现:
b = (b+1 + (b >> 8)) >> 8; // very fast
Run Code Online (Sandbox Code Playgroud)
哪里b是short int蓝色,而相同的代码会被视作r和b(红色和蓝色).评论没有帮助.
除了明显的转移和添加之外,我无法弄清楚它的作用.我可以不理解地移动,我只是出于好奇而问.
我发现了一些基于Fermat的小定理声称检查素性的Python代码:
def CheckIfProbablyPrime(x):
return (2 << x - 2) % x == 1
Run Code Online (Sandbox Code Playgroud)
我的问题:
我正在研究这段代码,我不明白这行是做什么的: [(y << 3) + x]
for (int y = 0; y <= 7; ++y) {
for (int x = 0; x <= 7; ++x) {
final String pieceCode = pieceCodes[(y << 3) + x];
if (pieceCode.length() != 2) throw new IllegalArgumentException();
if (!pieceCode.equals("--")) {
pieces[((7 - y) << 3) + x] = CheckersPiece.valueOf(pieceCode.charAt(0), pieceCode.charAt(1));
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在代码中遇到了下面的行
unsigned char A = 0xB9;
unsigned char B = 0x91;
unsigned char C = A << 3; // shift bits in A three bits to the left.
unsigned char D = B >> 2; // shift bits in B two bits to the right.
Run Code Online (Sandbox Code Playgroud)
我知道它有点变化,但我不知道它的用途是什么,何时应该使用它?
我看到了建议(参见例如,在C中使用移位运算符进行乘法和除法实际上更快吗?),你不应该用移位运算符手动替换乘法,因为编译器必须自动执行,移位运算符会降低可读性.我写了一个简单的测试来检查这个:
import numpy as np
import time
array1 = np.random.randint(size=10 ** 6, low=0, high=10 ** 5)
array2 = np.zeros((10 ** 6,), dtype=np.int)
total = 0.0
for i in range(100):
start = time.clock()
for j in range(len(array2)):
array2[j] = array1[j] * 2
total += time.clock() - start
print("*2 time = " + str(round(total / 10, 5)) + " ms")
total = 0.0
for i in range(100):
start = time.clock()
for j in range(len(array2)):
array2[j] = array1[j] << 1
total …Run Code Online (Sandbox Code Playgroud) c ×6
c++ ×4
optimization ×2
python ×2
algorithm ×1
bit-shift ×1
cpython ×1
division ×1
java ×1
math ×1
performance ×1
primes ×1
python-3.x ×1