電子書籍の厳選無料作品が豊富!

うるう年を求めるのに
if ((((year & 3) == 0) && (year % 100 != 0)) || (year % 400 == 0))
というソースがあったのですが
year & 3とはyearをビット演算するということでしょうか
もしそうだとするとしたらどうなるのでしょうか

A 回答 (3件)

(year & 3) == 0 というのは、3(2進数で11、それより左のビットは0)との論理積を取ることで、簡単に言えば4の倍数なら0になるということです。

下位2ビットの数字がいずれもゼロの正の整数は、必ず4の倍数です。No.2の回答にある (year % 4) == 0と同義です。

なぜそんな変な書き方をしているかというと、CPUは除算演算(DIV -> JZ)よりも論理演算(AND -> JZ)の方が演算コストが低いからなのですが、恐らく昔からコンピュータプログラムを書いている人だったり、除算器を持たない組込み系CPUのソフトウェアを書いている人だったりが書いたものなのかなと思います。最近のコンパイラはある程度賢くて、「% 4」は「& 3」と書いたのと同じコードを吐き出してくれたりしますので、実はどちらでもいいという話はあります。

なお、その右はご存知とは思いますが、1世紀ごとに閏年じゃないけど(year % 100 !=0)しかし4世紀ごとに閏年が来るよ(year % 400 == 0)という意味です。
    • good
    • 0

あまり詳しくないのですが、


year%4の誤りではないですか?
そんな計算式見た事ない。
    • good
    • 0
この回答へのお礼

yyy4のとき 0000 0000 0000 0100
3 0011
になるのでこれで%4の代わりになるみたいです

お礼日時:2022/01/31 19:53

適当な数字を使って実際に計算してみてくださいな.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!