相关疑难解决方法(0)

哪个是用于将整数除以2的更好选项?

以下哪种技术是将整数除以2的最佳选择,为什么?

技巧1:

x = x >> 1;
Run Code Online (Sandbox Code Playgroud)

技术2:

x = x / 2;
Run Code Online (Sandbox Code Playgroud)

x是一个整数.

c c++ optimization division micro-optimization

401
推荐指数
20
解决办法
6万
查看次数

在某个位置或更低位置计算设置位的有效方法是什么?

给定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的范围

c++ algorithm performance bit-manipulation

33
推荐指数
4
解决办法
5006
查看次数

x86中历史上推荐使用哪种C优化实践不再有效?

由于x86的C编译器(即GCC和锵)的进步,这被认为提高效率许多编码做法已不再使用,因为编译器能够做得更好优化比人类的代码(例如位移位与乘法).

这些具体做法是什么?

c optimization

27
推荐指数
2
解决办法
882
查看次数

找到两个值的平均值的正确方法是什么?

我最近了解到整数溢出是C中未定义的行为(侧面问题 - 它是否也是C++中的UB?)

经常在C语言编程,你需要找到两个值的平均值ab.但是,这样做(a+b)/2会导致溢出和未定义的行为.

所以我的问题是-什么是找到两个值的平均值的正确方法a,并b用C?

c integer-overflow undefined-behavior

17
推荐指数
3
解决办法
3498
查看次数

C/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++ bit-shift multiplication

9
推荐指数
2
解决办法
1120
查看次数

什么(r + 1 +(r >> 8))>> 8呢?

在一些旧的C/C++图形相关代码中,我必须移植到Java和JavaScript,我发现:

b = (b+1 + (b >> 8)) >> 8; // very fast
Run Code Online (Sandbox Code Playgroud)

哪里bshort int蓝色,而相同的代码会被视作rb(红色和蓝色).评论没有帮助.

除了明显的转移和添加之外,我无法弄清楚它的作用.我可以不理解地移动,我只是出于好奇而问.

c bit-manipulation

5
推荐指数
1
解决办法
320
查看次数

根据费马的小定理解释检查素性的代码

我发现了一些基于Fermat的小定理声称检查素性的Python代码:

def CheckIfProbablyPrime(x):
    return (2 << x - 2) % x == 1
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 它是如何工作的?
  2. 它与费马小定理的关系是什么?
  3. 这种方法有多准确?
  4. 如果它不准确,使用它有什么好处?

我在这里找到.

python math primes prime-factoring

4
推荐指数
1
解决办法
3821
查看次数

Java- for循环使用<<运算符

我正在研究这段代码,我不明白这行是做什么的: [(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)

java

3
推荐指数
1
解决办法
485
查看次数

位移的目的是什么?

我在代码中遇到了下面的行

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 c++

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

Python会自动用<< 1替换*2吗?

我看到了建议(参见例如,在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)

python cpython python-3.x python-internals

1
推荐指数
1
解决办法
100
查看次数