質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

201閲覧

C言語における論理演算について

Velonica

総合スコア35

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2017/07/20 23:06

論理積演算に関する質問です。

a & b の式があった場合、b = 2^n - 1 の時、a % (b + 1)と解釈されるという記述があったのですが、どうしてそうなるのかがわかりません。
どのような計算をすれば導けるかのか、ご教授いただけると幸いです。

<例>
column & 7 = column % 8

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

今すぐその本を捨ててください、そんな明らかな誤りのある入門書を使って勉強する必要はない。

…半分冗談、半分本気です。誤った記載であるのは事実。

まず、先に示された2種類のコードは、限定的な条件では同一の結果を生じます。

条件1、aが非負であること。
条件2、bが2^n-1で、それがその型で表現可能な最大の数でないこと。

この場合、結果は同一になります。下の例を考えてみてください。

a = 01100011(二進法。十進法なら99)
b = 00000111(二進法。十進法なら7)
論理積 00000011(下位3ビットを抽出)
b+1との剰余 b+1は00001000なので、余りは下位3桁の00000011となる。
(十進法で、65535を1000で割ったときの余りをどう考えますか? それと同じです。)

一方で、条件に合わない場合は、結果は同じにならないことがあります。-1 % 2の余りは、-1であり、論理積の結果1とは違います(環境次第)。また、bが型で表現可能な最大の数の場合、b+1は「多くの場合」0になるので(符号なしの場合)、剰余を計算しようとすると0除算エラーが発生します。

というわけで、本の言うことを鵜呑みにしてはいけませんよ、という結論。

参考文献
http://www.kijineko.co.jp/tech/superstitions/division-by-pow2-is-shift-right.html
https://www.google.co.jp/amp/shunirr.hatenablog.jp/entry/20120409/1333993409%3famp=1

投稿2017/07/21 00:58

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Velonica

2017/07/22 02:30

なるほど、大変わかりやすい回答ありがとうございます。 他の御二方の回答を理解できなのですが、成立しない条件まで教えていただいたmakiponiさんを今回はベストアンサーにしたいと思います。 ありがとうございました。
guest

0

こんにちは。

(2^n - 1)を2進数で表現すると、0*m ++ 1*nの形になるのはわかりますか?
それを任意の数値と論理積をとることは、「上位mビットを0にする」と言い換えることができます。
(column & 7)はcolumnの下位3ビット分だけを切り出したものとなるわけです。
つまり、この数値の範囲は[0 - 7]になります。

投稿2017/07/20 23:48

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

a & bでaの下n桁を抜き出す形になりますね。それをふまえて、なじみ深い10進数にたとえてみました。

12345678から、例えば下4桁を抜き出すと5678です。一方、12345678を10の4乗(つまり10000)で割ると、12345678 = 12340000 + 5678ですので余りは同じく5678です。

こんな感じのイメージでいかがでしょうか?

投稿2017/07/20 23:53

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問