- ベストアンサー
c言語による2のべき乗
右、左シフトと2のべき乗による乗除算が同じことを証明するプログラムを作っているのですがうまくいきません。 プログラムを載せるのでどこが間違っているのかご教授お願いします。 #include <stdio.h> int count_bits(unsigned x){ int count = 0; while(x){ if(x&1U) count++; x>>=1; } return(count); } int int_bits(void){ return(count_bits(~0U)); } void print_bits(unsigned x){ int i; for(i=int_bits()-1; i>=0; i--) putchar(((x>>i)&1U) ? '1' : '0'); } int main(void){ unsigned nx, no, n1, n2; printf("非負の整数を入力してください:"); scanf("%u", &nx); printf("何ビットシフトしますか?:"); scanf("%u", &no); n1=nx * (2^no); n2=nx / (2^no); printf("\n整数 = "); print_bits(nx); printf("\n左にシフトした値 = "); print_bits(nx << no); printf("\n右にシフトした値 = "); print_bits(nx >> no); printf("\n2のべき乗で乗算した値 = "); print_bits(n1); printf("\n2のべき乗で除算した値 = "); print_bits(n2); putchar('\n'); return(0); }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
n1=nx * (2^no); n2=nx / (2^no); この部分の ^ はCの演算子では排他的論理和(XOR)で累乗ではありませんよ。 累乗ならpow関数を使用するか(double型になるので、これを使うのは不適切かも) 単純に乗算の繰り返しまで分解して計算させる必要がありますね。 ちなみに整数の計算では最適化の処理で乗算や除算が内部でシフト演算に変換されている場合もありますので、 最適化のオプションを無効にしないと意味が無いかもしれません。
その他の回答 (1)
- sittaka-kun
- ベストアンサー率22% (153/686)
科学的手法に対する質問では、「xxxという結果を期待してyyyという方法をとったところ、(予想に反して)zzzという結果が得られた」という情報が不可欠です。 このような情報なしに質問をしても、c言語に用意されていないべき乗演算子を使ったプログラム程度の結果しか得られないと思います。