今日習ったばかりなのですが…

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
クロマ

今日習ったばかりなのですが…

#1

投稿記事 by クロマ » 16年前

初めまして、クロマと申します。C++超絶初心者です、どんなおばかも救ってくれるサイト様だと聴いて
やってきました。 今日学校で習ったばかりの演算子の質問をさせてください、課題がだされているので
そこからお聞きしたいと思います。

char型変数dataの0ビット目のみ0にして、その他のビットは変化させないようにする演算式を作りなさい

という課題です、データ型や変数の定義や表記法、制御文字列等の理解は出来ているのですが、ビットシフトや
ビットセットの類が物凄く苦手で、そのての演算式だけが出来ないんです。 何か有効な勉強方法を教えて頂けたらありがたいですm(-.-)m 今回の課題も解説して頂けますでしょうか? よろしくお願いします。

クロマ

Re:今日習ったばかりなのですが…

#2

投稿記事 by クロマ » 16年前

すみません、先ほどのクロまです。アドレスを忘れてマシた!
ドジですいません!

たかぎ

Re:今日習ったばかりなのですが…

#3

投稿記事 by たかぎ » 16年前

たぶん求めている回答ではありませんが、まずは正直に解説します。

> char型変数dataの0ビット目のみ0にして、その他のビットは変化させないようにする演算式を作りなさい

この課題は非常に難度が高いものです。
問題となる点を以下に列挙します。

・char型が符号付きか符号無しかは処理系定義
・符号付き整数を右シフトした場合の動作は処理系定義
・負の値を持つ符号付き整数の左シフト、または符号付き整数表現範囲を超える左シフトは未定義の動作
・符号付き整数に対するビット演算の結果は処理系定義
・符号付き整数から符号無し整数に型変換した場合、変換後の型の最大値+1を法とする剰余になる
・符号無し整数から符号付き整数に型変換した場合、変換後の型の表現範囲を超えていれば、処理系定義の値になるか、処理系定義のシグナルが発生
・符号付き整数に対するビット演算またはシフト演算の結果、トラップ表現が生じる可能性あり

これらを考慮すると、char型が符号付きの場合、
data = (char)(data / 2 * 2);
とするしかないように思います。

ただし、負の値に1の補数表現を使う場合、-1 / 2 * 2は0になるわけですが、これが-0になってくれるかどうかは処理系定義です。
となると、処理系に依存しない実現方法はないような気もします。

最後の手段として、共用体の使用も考えられますが、代入したメンバとは異なるメンバを通してデータにアクセスした場合の振る舞いは処理系定義なってしまいますので、やはりだめです。

クロマ

すばやい回答ありがとうございます!

#4

投稿記事 by クロマ » 16年前

たかぎ さん、急な質問に対しての回答ありがとうございました!!
内容も親切でとても解かりやすかったです。
課題の発表が明日だったのですが、自信を持って臨めます!
本当にありがとうございました!!(⌒▽⌒)

toyo

Re:すばやい回答ありがとうございます!

#5

投稿記事 by toyo » 16年前

いや
求めてる回答ではない
とわざわざ書かれていますよ

data = data & 0xFE;
でいいと思います

たかぎ

Re:すばやい回答ありがとうございます!

#6

投稿記事 by たかぎ » 16年前

> data = data & 0xFE;

これはダメでしょう。
普通は、
data = data & ~1;
です。

閉鎖

“C言語何でも質問掲示板” へ戻る