例年、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倍の遅さ