右へシフト演算した時の答え

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

右へシフト演算した時の答え

#1 投稿記事 by 7 »

シフト演算ってよく分からないですし、C/C++での答えがどうなるか知らないんですけど、「10 >> 5」は、「10 * ( 1/(1<<5) )」と等しくなると思ったんですけど、違いました。というか、「Int(10 * ( 1/(1<<5) ))」でした。
この答えって正しいんでしょうか?

追記。
「10 * ( 1/(1<<5) )」ってよく考えたら「10 / (1<<5)」ですね。
KICO
記事: 57
登録日時: 2005年12月13日(火) 17:42

Re: 右へシフト演算した時の答え

#2 投稿記事 by KICO »

シフト演算ってよく分からないですし、・・・
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/(1<<5) )」と等しくなると思ったんですけど、違いました。というか、「Int(10 * ( 1/(1<<5) ))」でした。
この答えって正しいんでしょうか?
「10 >> 5」だと "0" に成りますし、「1 << 5」 だと "&h20(32)" です。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#3 投稿記事 by tak »

> 「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)

とすればよいと思います。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: 右へシフト演算した時の答え

#4 投稿記事 by 7 »

> 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/(1<<5) )」と等しくなると思ったんですけど、違いました。というか、「Int(10 * ( 1/(1<<5) ))」でした。
> この答えって正しいんでしょうか?
> 「10 >> 5」だと "0" に成りますし、「1 << 5」 だと "&h20(32)" です。
いえ、「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) )」なんて複雑に考えてましたけど...。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#5 投稿記事 by 7 »

> シフト演算には結果を丸める性質があるので注意してください。
> ABでは
>
>   x >> n == x \ (1 << n)
>
> となります。
一生懸命数式書いてたら(数学苦手なので)絶妙な答えが返ってました...。

シフト演算は整数しか扱えないんですか?

追記。
\ってことは整数除算ですね...( ̄□ ̄;)
ちょっと頭の中が絡まってました...。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#6 投稿記事 by tak »

> シフト演算は整数しか扱えないんですか?

固定小数点の計算なら小数も扱えます。ただ、ABにそのような型はありませんので「整数しか扱えない」と思って差し支えありません。

ビットシフト演算はメモリ上のデータを直接的に操作します。
だから「プログラムで変数に代入した値はメモリの中にどのように格納されるのか」を意識しないと真に理解することは難しいでしょう。
この「メモリ上での値の表現法」について、もっと掘り下げてみませんか。ネット上には秀逸な資料が多数公開されています。
またいろんな書籍でも解説されています。中でもイチオシ→ プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識 矢沢 久雄 (著) (Amazon) [アフィリエイトじゃないっすよ、念のため]
コンピュータの世界が 0 と 1 の羅列で出来ていることが実感できますよ。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#7 投稿記事 by 7 »

> 固定小数点の計算なら小数も扱えます。ただ、ABにそのような型はありませんので「整数しか扱えない」と思って差し支えありません。
はい。分かりました。

> ビットシフト演算はメモリ上のデータを直接的に操作します。
> だから「プログラムで変数に代入した値はメモリの中にどのように格納されるのか」を意識しないと真に理解することは難しいでしょう。
> この「メモリ上での値の表現法」について、もっと掘り下げてみませんか。ネット上には秀逸な資料が多数公開されています。
> またいろんな書籍でも解説されています。中でもイチオシ→ プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識 矢沢 久雄 (著) (Amazon) [アフィリエイトじゃないっすよ、念のため]
> コンピュータの世界が 0 と 1 の羅列で出来ていることが実感できますよ。
この本、以前図書館で借りて読んだんですけど、よく分かりませんでした...。
また借りて読んでみようと思います。
返信する