例年、2進数演算の課題を出すと、2i の処理を、pow(2,i) で書く学生さんがいる。
しかしながら、pow() は、double 型なので遅い。これは、2進数の特徴を踏まえれば、1 << i で書けば良い。
試しに、実際の処理速度を測ってみた。
#include <stdio.h>
#include <math.h>
long long int mask( ) {
long long int m ;
for( int j = 0 ; j < 10000000 ; j++ ) {
m = 0 ;
for( int i = 0 ; i < 60 ; i++ ) {
m += pow( 2 , i ) ;
// m |= (1 << i) ;
}
}
return m ;
}
int main() {
long long int x = mask() ;
return 0 ;
}
m |= (1 << i) ; --------- 1.296 [sec]
m += pow( 2 , i ) ; ----- 44.956 [sec]
40倍の遅さ