初めまして、クロマと申します。C++超絶初心者です、どんなおばかも救ってくれるサイト様だと聴いて
やってきました。 今日学校で習ったばかりの演算子の質問をさせてください、課題がだされているので
そこからお聞きしたいと思います。
char型変数dataの0ビット目のみ0にして、その他のビットは変化させないようにする演算式を作りなさい
という課題です、データ型や変数の定義や表記法、制御文字列等の理解は出来ているのですが、ビットシフトや
ビットセットの類が物凄く苦手で、そのての演算式だけが出来ないんです。 何か有効な勉強方法を教えて頂けたらありがたいですm(-.-)m 今回の課題も解説して頂けますでしょうか? よろしくお願いします。
今日習ったばかりなのですが…
Re:今日習ったばかりなのですが…
たぶん求めている回答ではありませんが、まずは正直に解説します。
> char型変数dataの0ビット目のみ0にして、その他のビットは変化させないようにする演算式を作りなさい
この課題は非常に難度が高いものです。
問題となる点を以下に列挙します。
・char型が符号付きか符号無しかは処理系定義
・符号付き整数を右シフトした場合の動作は処理系定義
・負の値を持つ符号付き整数の左シフト、または符号付き整数表現範囲を超える左シフトは未定義の動作
・符号付き整数に対するビット演算の結果は処理系定義
・符号付き整数から符号無し整数に型変換した場合、変換後の型の最大値+1を法とする剰余になる
・符号無し整数から符号付き整数に型変換した場合、変換後の型の表現範囲を超えていれば、処理系定義の値になるか、処理系定義のシグナルが発生
・符号付き整数に対するビット演算またはシフト演算の結果、トラップ表現が生じる可能性あり
これらを考慮すると、char型が符号付きの場合、
ただし、負の値に1の補数表現を使う場合、-1 / 2 * 2は0になるわけですが、これが-0になってくれるかどうかは処理系定義です。
となると、処理系に依存しない実現方法はないような気もします。
最後の手段として、共用体の使用も考えられますが、代入したメンバとは異なるメンバを通してデータにアクセスした場合の振る舞いは処理系定義なってしまいますので、やはりだめです。
> char型変数dataの0ビット目のみ0にして、その他のビットは変化させないようにする演算式を作りなさい
この課題は非常に難度が高いものです。
問題となる点を以下に列挙します。
・char型が符号付きか符号無しかは処理系定義
・符号付き整数を右シフトした場合の動作は処理系定義
・負の値を持つ符号付き整数の左シフト、または符号付き整数表現範囲を超える左シフトは未定義の動作
・符号付き整数に対するビット演算の結果は処理系定義
・符号付き整数から符号無し整数に型変換した場合、変換後の型の最大値+1を法とする剰余になる
・符号無し整数から符号付き整数に型変換した場合、変換後の型の表現範囲を超えていれば、処理系定義の値になるか、処理系定義のシグナルが発生
・符号付き整数に対するビット演算またはシフト演算の結果、トラップ表現が生じる可能性あり
これらを考慮すると、char型が符号付きの場合、
data = (char)(data / 2 * 2);とするしかないように思います。
ただし、負の値に1の補数表現を使う場合、-1 / 2 * 2は0になるわけですが、これが-0になってくれるかどうかは処理系定義です。
となると、処理系に依存しない実現方法はないような気もします。
最後の手段として、共用体の使用も考えられますが、代入したメンバとは異なるメンバを通してデータにアクセスした場合の振る舞いは処理系定義なってしまいますので、やはりだめです。
すばやい回答ありがとうございます!
たかぎ さん、急な質問に対しての回答ありがとうございました!!
内容も親切でとても解かりやすかったです。
課題の発表が明日だったのですが、自信を持って臨めます!
本当にありがとうございました!!(⌒▽⌒)
内容も親切でとても解かりやすかったです。
課題の発表が明日だったのですが、自信を持って臨めます!
本当にありがとうございました!!(⌒▽⌒)