シフト演算ってよく分からないですし、C/C++での答えがどうなるか知らないんですけど、「10 >> 5」は、「10 * ( 1/(1<<5) )」と等しくなると思ったんですけど、違いました。というか、「Int(10 * ( 1/(1<<5) ))」でした。
この答えって正しいんでしょうか?
追記。
「10 * ( 1/(1<<5) )」ってよく考えたら「10 / (1<<5)」ですね。
右へシフト演算した時の答え
Re: 右へシフト演算した時の答え
2進数に置き換えてから考えると解り易いですよ。シフト演算ってよく分からないですし、・・・
例えば、10>>1(10(&hA)を右シフト1)とすると"5"に成り、10>>2(右シフト2)だと"2" と成ります。
[2進数表記]
8 4 2 1 8 4 2 1
1 0 1 0 -> 0 1 0 1 (10 >> 1)
1 0 1 0 -> 0 0 1 0 (10 >> 2)
「10 >> 5」だと "0" に成りますし、「1 << 5」 だと "&h20(32)" です。「10 >> 5」は、「10 * ( 1/(1<<5) )」と等しくなると思ったんですけど、違いました。というか、「Int(10 * ( 1/(1<<5) ))」でした。
この答えって正しいんでしょうか?
> 「10 >> 5」は、「10 * ( 1/(1<<5) )」と等しくなると思ったんですけど、違いました。
> というか、「Int(10 * ( 1/(1<<5) ))」でした。
> この答えって正しいんでしょうか?
はい。理論的には正しいです。
ABの除算演算子は3種類存在し、それらの使い分けが出来ていないことに起因するエラーです。
'/' 演算子は実数値で結果を返します。だから「10 * ( 1/(1<<5) )」ではうまくいかなかったのですね。
'\' 演算子は整数値で商だけを返します。余りを返す 'Mod' 演算子も忘れずに。
"Int(x / y)" は単に "x \ y" と置換できます。
ですから
10 \ (1 << 5)
とすればよいと思います。
> というか、「Int(10 * ( 1/(1<<5) ))」でした。
> この答えって正しいんでしょうか?
はい。理論的には正しいです。
ABの除算演算子は3種類存在し、それらの使い分けが出来ていないことに起因するエラーです。
'/' 演算子は実数値で結果を返します。だから「10 * ( 1/(1<<5) )」ではうまくいかなかったのですね。
'\' 演算子は整数値で商だけを返します。余りを返す 'Mod' 演算子も忘れずに。
"Int(x / y)" は単に "x \ y" と置換できます。
ですから
10 \ (1 << 5)
とすればよいと思います。
ここをクリックすると補足を表示します。 [ここをクリックすると内容が表示されます]
数式を扱うので、紙と鉛筆を準備してください。そのほうが理解しやすいです。
ビットシフト演算は、数学的には 2 を底とする指数演算です。
x << n == x * (2 ^ +n) … (1)
x >> n == x * (2 ^ -n) … (2)
となります。
(2)式の指数部は負符号ですから指数の符号を反転して分母に落とすことにより
次のように変形できます。
x * (2 ^ -n)
== x / (2 ^ +n)
== x / (1 * (2 ^ +n)) … (3)
(3)式を(1)式と照らし合わせると、分母部分はシフト演算で置き換えられることがわかります。
ゆえに
x >> n == x / (1 << n)
は成り立ちます。
シフト演算には結果を丸める性質があるので注意してください。
ABでは
x >> n == x \ (1 << n)
となります。
ビットシフト演算は、数学的には 2 を底とする指数演算です。
x << n == x * (2 ^ +n) … (1)
x >> n == x * (2 ^ -n) … (2)
となります。
(2)式の指数部は負符号ですから指数の符号を反転して分母に落とすことにより
次のように変形できます。
x * (2 ^ -n)
== x / (2 ^ +n)
== x / (1 * (2 ^ +n)) … (3)
(3)式を(1)式と照らし合わせると、分母部分はシフト演算で置き換えられることがわかります。
ゆえに
x >> n == x / (1 << n)
は成り立ちます。
シフト演算には結果を丸める性質があるので注意してください。
ABでは
x >> n == x \ (1 << n)
となります。
Re: 右へシフト演算した時の答え
> 2進数に置き換えてから考えると解り易いですよ。
> 例えば、10>>1(10(&hA)を右シフト1)とすると"5"に成り、10>>2(右シフト2)だと"2" と成ります。
>
> [2進数表記]
> 8 4 2 1 8 4 2 1
> 1 0 1 0 -> 0 1 0 1 (10 >> 1)
> 1 0 1 0 -> 0 0 1 0 (10 >> 2)
すごい分かりやすいですね...( ̄□ ̄;)
>
いえ、「10 >> 5」の答えと「10 / (1<<5)」の答えが等しくならないので右シフトの答えが間違っているんじゃないかと思いました。
どうして等しくなると思ったかは、ActiveBasicでシフト演算の勉強をしていて、「1 << 1 = 2」,「1 << 2 = 4」,「1 << 3 = 8」,「1 << 4 = 16」となることから、「x << y = x * (2^y)」ということに気付いて、じゃあ右シフトなら「x >> y = x / (2^y)」になると思ったんです。
最初は何を思ったか「x >> y = x * ( 1/(x * 2^y) )」なんて複雑に考えてましたけど...。
> 例えば、10>>1(10(&hA)を右シフト1)とすると"5"に成り、10>>2(右シフト2)だと"2" と成ります。
>
> [2進数表記]
> 8 4 2 1 8 4 2 1
> 1 0 1 0 -> 0 1 0 1 (10 >> 1)
> 1 0 1 0 -> 0 0 1 0 (10 >> 2)
すごい分かりやすいですね...( ̄□ ̄;)
>
> 「10 >> 5」だと "0" に成りますし、「1 << 5」 だと "&h20(32)" です。「10 >> 5」は、「10 * ( 1/(1<<5) )」と等しくなると思ったんですけど、違いました。というか、「Int(10 * ( 1/(1<<5) ))」でした。
> この答えって正しいんでしょうか?
いえ、「10 >> 5」の答えと「10 / (1<<5)」の答えが等しくならないので右シフトの答えが間違っているんじゃないかと思いました。
どうして等しくなると思ったかは、ActiveBasicでシフト演算の勉強をしていて、「1 << 1 = 2」,「1 << 2 = 4」,「1 << 3 = 8」,「1 << 4 = 16」となることから、「x << y = x * (2^y)」ということに気付いて、じゃあ右シフトなら「x >> y = x / (2^y)」になると思ったんです。
最初は何を思ったか「x >> y = x * ( 1/(x * 2^y) )」なんて複雑に考えてましたけど...。
> シフト演算は整数しか扱えないんですか?
固定小数点の計算なら小数も扱えます。ただ、ABにそのような型はありませんので「整数しか扱えない」と思って差し支えありません。
ビットシフト演算はメモリ上のデータを直接的に操作します。
だから「プログラムで変数に代入した値はメモリの中にどのように格納されるのか」を意識しないと真に理解することは難しいでしょう。
この「メモリ上での値の表現法」について、もっと掘り下げてみませんか。ネット上には秀逸な資料が多数公開されています。
またいろんな書籍でも解説されています。中でもイチオシ→ プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識 矢沢 久雄 (著) (Amazon) [アフィリエイトじゃないっすよ、念のため]
コンピュータの世界が 0 と 1 の羅列で出来ていることが実感できますよ。
固定小数点の計算なら小数も扱えます。ただ、ABにそのような型はありませんので「整数しか扱えない」と思って差し支えありません。
ビットシフト演算はメモリ上のデータを直接的に操作します。
だから「プログラムで変数に代入した値はメモリの中にどのように格納されるのか」を意識しないと真に理解することは難しいでしょう。
この「メモリ上での値の表現法」について、もっと掘り下げてみませんか。ネット上には秀逸な資料が多数公開されています。
またいろんな書籍でも解説されています。中でもイチオシ→ プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識 矢沢 久雄 (著) (Amazon) [アフィリエイトじゃないっすよ、念のため]
コンピュータの世界が 0 と 1 の羅列で出来ていることが実感できますよ。
> 固定小数点の計算なら小数も扱えます。ただ、ABにそのような型はありませんので「整数しか扱えない」と思って差し支えありません。
はい。分かりました。
> ビットシフト演算はメモリ上のデータを直接的に操作します。
> だから「プログラムで変数に代入した値はメモリの中にどのように格納されるのか」を意識しないと真に理解することは難しいでしょう。
> この「メモリ上での値の表現法」について、もっと掘り下げてみませんか。ネット上には秀逸な資料が多数公開されています。
> またいろんな書籍でも解説されています。中でもイチオシ→ プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識 矢沢 久雄 (著) (Amazon) [アフィリエイトじゃないっすよ、念のため]
> コンピュータの世界が 0 と 1 の羅列で出来ていることが実感できますよ。
この本、以前図書館で借りて読んだんですけど、よく分かりませんでした...。
また借りて読んでみようと思います。
はい。分かりました。
> ビットシフト演算はメモリ上のデータを直接的に操作します。
> だから「プログラムで変数に代入した値はメモリの中にどのように格納されるのか」を意識しないと真に理解することは難しいでしょう。
> この「メモリ上での値の表現法」について、もっと掘り下げてみませんか。ネット上には秀逸な資料が多数公開されています。
> またいろんな書籍でも解説されています。中でもイチオシ→ プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識 矢沢 久雄 (著) (Amazon) [アフィリエイトじゃないっすよ、念のため]
> コンピュータの世界が 0 と 1 の羅列で出来ていることが実感できますよ。
この本、以前図書館で借りて読んだんですけど、よく分かりませんでした...。
また借りて読んでみようと思います。