#include <stdio.h>
int main(void)
{
int i;
for(i=1;i<=100;i++) {
long long int f = ((21846*i>>16)-(21845*i>>16))*2054842694;
long long int b = ((13108*i>>16)-(13107*i>>16))*2054845762;
printf((char*)&f);
printf((char*)&b);
f||b||printf("%d",i);
puts("");
}
}
整数型のポインタをchar*
に読み替えるの、未定義動作だった気がするけど、よく理解していない。
さらには、文字コードがASCII互換かどうかは処理系依存だったはず。
私の処理系ではintは4バイトだったので、long long intにしておかないとNUL文字を入れる場所がなくなって、ちゃんと表示できない。
(21846*i>>16)-(21845*i>>16)
の部分について。
(1<<16)/3.0
は21845.3333...になる。なので、iが十分に小さければ 21846*i>>16
はi/3
になる。
で、3回引き算してi%3
にしようかと考えていたが、21845*i>>16
は、ちょうどi%3==0
のときだけ、21846*1>>16
と答えが違うことが分かった。なので、それを使った。
その下の行も同様。