相关疑难解决方法(0)

使用C中的移位运算符的乘法和除法实际上更快吗?

例如,可以使用位运算符来实现乘法和除法

i*2 = i<<1
i*3 = (i<<1) + i;
i*10 = (i<<3) + (i<<1)
Run Code Online (Sandbox Code Playgroud)

等等.

实际上使用say (i<<3)+(i<<1)乘以10比i*10直接使用更快吗?是否有任何类型的输入不能以这种方式倍增或分割?

c c++ bit-shift multiplication division

282
推荐指数
8
解决办法
9万
查看次数

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

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

.net c# java optimization bit-manipulation

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

ac/c ++编译器是否将两次幂值的常量除法优化为移位?

问题说明了一切.有谁知道以下......

size_t div(size_t value) {
    const size_t x = 64;
    return value / x;
}
Run Code Online (Sandbox Code Playgroud)

...优化成?

size_t div(size_t value) {
    return value >> 6;
}
Run Code Online (Sandbox Code Playgroud)

编译器会这样做吗?(我的兴趣在于GCC).是否有这样的情况,有些情况不是吗?

我真的很想知道,因为每当我写一个可以像这样优化的师时,我会花费一些心理能量,想知道一秒钟的宝贵事迹是否会浪费在一个转变就足够的分裂上.

c c++ optimization gcc

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

我应该在Java中按位移2除以?

可能重复:
比Java中的乘法和除法更快地移位位?.净?
快速Java优化问题

很多年前,在大学里,我学会了正确地按位移动实现与除以2相同的操作,但通常要快得多.自从9-10年前我了解到这一点以来,我不确定Java在这方面是如何出现的.Java编译器是否自动将二分频转换为位移操作,还是应该自己在代码中手动执行位移操作?

java performance bit-manipulation bit-shift division

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

您会使用num%2或num&1来检查数字是否均匀?

那么,至少有两种低级方法可以确定给定的数字是否是偶数:

 1. if (num%2 == 0) { /* even */ } 
 2. if ((num&1) == 0) { /* even */ }
Run Code Online (Sandbox Code Playgroud)

我认为第二种选择更加优雅和有意义,而这正是我经常使用的选择.但这不仅仅是品味问题; 实际性能可能会有所不同:通常按位操作(例如logial和here)比mod(或div)操作更有效.当然,你可能会争辩说有些编译器无论如何都能优化它,我同意......但有些人不会.

另一点是,对于经验不足的程序员来说,第二个可能有点难以理解.关于这一点,我回答说,如果这些程序员花很短的时间来理解这种语句,它可能只会让每个人受益.

你怎么看?

只有当num无符号整数或具有二进制补码表示的负数时,给定的两个片段才是正确的. - 正如一些评论所说的那样.

c++ numbers readability bitwise-operators low-level

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

C/C++:将0赋值给无符号长变量或者将变量与自身进行xor分解是否更快?

我意识到差异可以忽略不计,但是在尝试将无符号长度归零时哪个更有效?

unsigned long x;

...

x=0;

--OR--

x^=x;
Run Code Online (Sandbox Code Playgroud)

泰勒

c c++ performance xor variable-assignment

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

为什么"n&1 == 0"总是返回false?

为什么表达式n&1 == 0总是返回false,哪里n是整数?

我想使用按位运算来确定是否n是偶数.但是,它总是返回false.(克里昂也促使我总是回来false).

更重要的是,它n&1 != 0用于确定是否n奇怪.

c c++ c++11

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

编译成更快的代码:"n*3"或"n +(n*2)"?

编译成更快的代码:"ans = n*3"或"ans = n +(n*2)"?

假设n是int或long,它是在现代Win32 Intel盒子上运行的.

如果涉及一些解除引用,这会有所不同,也就是说,哪些更快?


long    a;
long    *pn;
long     ans;

...
*pn = some_number;
ans = *pn * 3;

要么

ans = *pn+(*pn*2);

或者,它是否需要不用担心,因为优化编译器在任何情况下都可能解释这一点?

c c++ compiler-construction optimization performance

6
推荐指数
3
解决办法
1817
查看次数

g ++说:warning:语句对移位操作符没有影响

我正在实施alkhwarizmi算法.
这是正确的,但我的g ++编译器不喜欢移位运算符:>>和<<或我做错了什么.
当我编译它时,我得到这个输出:

> g++ -Wall  -std=c++0x -o "Al-khwarizmi algorithm.o" "Al-khwarizmi algorithm.cpp" (in directory: /home/akronix/workspace/Algorithms)
> Al-khwarizmi algorithm.cpp: In function ‘int alkhwarizmi(int, int)’: Al-khwarizmi algorithm.cpp:31:9: warning: statement has no effect
> [-Wunused-value] Al-khwarizmi algorithm.cpp:34:9: warning: statement
> has no effect [-Wunused-value] Compilation finished successfully.
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

int alkhwarizmi(int x, int y)
{
    int sum = 0;
    while (x>0)
    {
        if (x%2)
            sum+=y;
        //y *= 2;
        y << 1;
        cout << y <<endl;
        //x /= 2;
        x >> 1;
        cout << …
Run Code Online (Sandbox Code Playgroud)

c++ g++ bit-shift

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

分裂和转移之间的差异

我正在读这个问题.看完第一个答案后,我无法理解原因-5 >> 1 = -3.我还对它进行了一些调整.

您还可以在此处查看代码和输出.这是我做的:

#include<stdio.h>

int main(){

printf("5/2 = %d\n",5/2);
printf("5 >> 1 = %d\n",5 >> 1);
printf("5/2 = %lf\n",5/2);
printf("5 >> 1 = %f\n",5 >> 1);
printf("-5/2 = %d\n",-5/2);
printf("-5 >> 1 = %d\n",-5 >> 1);
printf("-5/2 = %f\n",-5/2);
printf("-5 >> 1 = %f\n",-5 >> 1);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

5/2 = 2
5 >> 1 = 2
5/2 = 2.168831
5 >> 1 = 2.168831
-5/2 = -2
-5 >> …
Run Code Online (Sandbox Code Playgroud)

c floating-point bit-shift division

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

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

什么是除以2的替代方案

这是一个需要回答面试的问题,我只知道如何做到以下几点:

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

还有其他选择吗?

c++ java

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