例如,可以使用位运算符来实现乘法和除法
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直接使用更快吗?是否有任何类型的输入不能以这种方式倍增或分割?
如果您恰好使用2的幂,则左右移位显然比大多数甚至所有CPU上的乘法和除法运算更快.但是,它可能会降低某些读取器和某些算法的代码清晰度.位移对于性能是否真的是必要的,或者我可以期望编译器或VM注意到这种情况并对其进行优化(特别是当2的幂是文字时)?我主要对Java和.NET行为感兴趣,但欢迎深入了解其他语言实现.
问题说明了一切.有谁知道以下......
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).是否有这样的情况,有些情况不是吗?
我真的很想知道,因为每当我写一个可以像这样优化的师时,我会花费一些心理能量,想知道一秒钟的宝贵事迹是否会浪费在一个转变就足够的分裂上.
很多年前,在大学里,我学会了正确地按位移动实现与除以2相同的操作,但通常要快得多.自从9-10年前我了解到这一点以来,我不确定Java在这方面是如何出现的.Java编译器是否自动将二分频转换为位移操作,还是应该自己在代码中手动执行位移操作?
那么,至少有两种低级方法可以确定给定的数字是否是偶数:
1. if (num%2 == 0) { /* even */ }
2. if ((num&1) == 0) { /* even */ }
Run Code Online (Sandbox Code Playgroud)
我认为第二种选择更加优雅和有意义,而这正是我经常使用的选择.但这不仅仅是品味问题; 实际性能可能会有所不同:通常按位操作(例如logial和here)比mod(或div)操作更有效.当然,你可能会争辩说有些编译器无论如何都能优化它,我同意......但有些人不会.
另一点是,对于经验不足的程序员来说,第二个可能有点难以理解.关于这一点,我回答说,如果这些程序员花很短的时间来理解这种语句,它可能只会让每个人受益.
你怎么看?
只有当num无符号整数或具有二进制补码表示的负数时,给定的两个片段才是正确的. - 正如一些评论所说的那样.
我意识到差异可以忽略不计,但是在尝试将无符号长度归零时哪个更有效?
unsigned long x;
...
x=0;
--OR--
x^=x;
Run Code Online (Sandbox Code Playgroud)
泰勒
为什么表达式n&1 == 0总是返回false,哪里n是整数?
我想使用按位运算来确定是否n是偶数.但是,它总是返回false.(克里昂也促使我总是回来false).
更重要的是,它n&1 != 0用于确定是否n奇怪.
编译成更快的代码:"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);
或者,它是否需要不用担心,因为优化编译器在任何情况下都可能解释这一点?
我正在实施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) 我正在读这个问题.看完第一个答案后,我无法理解原因-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) 哪个执行得更快?
1:
n = n << 1;
Run Code Online (Sandbox Code Playgroud)
2:
n = n + n;
Run Code Online (Sandbox Code Playgroud)