![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
char型の変数にビット配列を代入しそれを文字として出力させたいのです。
どこが間違っているのか分かりませんが一応流れを書いたプログラムを載せておきます。
char binary = 0;
int i;
for(i=0;i<8;i++){
if(省略) binary = binary & 11111110;
else binary = binary | 00000001;
binary = binary << 1;
}
printf("実行結果 %c",binary);
実行結果 00110110
というように最下位ビットに0か1を代入し、左シフトをし、というのを繰り返しprintf("%c",binary)でビット列を表示させたいのですが、これを実行すると結果は文字化けしたようなものが表示されます。
charの配列を作ってビット列を表示させるやり方はわかるのですが、学校の課題みたいなもので配列を使ってはいけないみたいなのです。
教科書を読んでも分からないので困っています。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
No3 です。
今度は、「省略」の解明(◆)です。
「解明」してどうなるの、と問われればそれまてですが、何かの参考になればと。
-------------------------------------
むりくり、
>実行結果 00110110
になるように、プログラムしてみました。
-------------------------------------
#include <stdio.h>
#define un_char unsigned char
void main()
{
int i;
un_char cBinary = 0x00, cWork;
for( i = 0; i < 8; i++ ){
if( ( 0 == i ) || ( 1 == i ) || ( 2 == i ) || ( 5 == i ) ) cBinary &= (un_char)0xFE; // ◆
elsecBinary |= 0x01;
cBinary <<= 1;
}
for( i = 0; i < 8; i++ ){ // 1ビットずつの表示(2進風?)
cWork = cBinary >> ( 7 - i );
cWork &= 0x01;
cWork += 0x30;
printf( "%c", cWork );
}
}
★重要
1 と「表示」したいとき、%c フォーマット指定子をもちいて '1' (0x31)を出力
0 と「表示」したいとき、%c フォーマット指定子をもちいて '0' (0x30)を出力
-----------------------------------------
>これを実行すると結果は文字化けしたようなものが表示されます。
★理解できたのではないでしょうか(前の回答のアスキーコード表と併せて)。
No.4
- 回答日時:
省略で何をしているかわかりませんが、
アドバイスをひとつ。
>for(i=0;i<8;i++){
> if(省略) binary = binary & 11111110;
> else binary = binary | 00000001;
> binary = binary << 1;
>}
for文の8周目(最終周)の左シフトが余計です。
計算結果が9bitになってしまいます。
(実際はcharが8bitなので、最初の1bitの情報が欠けてしまいます。)
No.3
- 回答日時:
(「回答」ではありません)
「ビット配列」とか「左シフト」の文字を見ると、
「char型の変数に」は、「unsigned char型の変数に」とした方がよいかと・・。
(「趣味の世界」と言われればそのとおりですが)
#include <stdio.h>
void main()
{
unsigned char cAAA = 0x80;
char cBBB = 0x80;
cAAA >>= 1;
cBBB >>= 1;
printf( "%02X\n", cAAA );
printf( "%02X\n", cBBB );
}
これを実行すると、
40
FFFFFFC0 (オーバーフロー)
となります(「左シフト」だけならいいのですが)。
《参考》
http://e-words.jp/p/r-ascii.html
http://www.k-cube.co.jp/wakaba/server/format.html
No.2
- 回答日時:
フォーマット指定子 %c について調べてみてください
00110110=0x36
を文字表示させたら'6'じゃないんですかね。へんな文字が表示されますか?
ビット表示するには1回でまとめて
printf("実行結果 %c",binary);
ではできないと思います(%c以外でも)
1ビットずつ表示してください
No.1
- 回答日時:
★アドバイス
・C言語では2進表記は出来ません。
>if(省略) binary = binary & 11111110;
ここの部分の『11111110』を『0xFE』にでもすれば良いでしょう。
>else binary = binary | 00000001;
ここも同じく間違い。
>charの配列を作ってビット列を表示させるやり方はわかるのですが、学校の課題みたいなもので配列を
>使ってはいけないみたいなのです。
↑
ビット演算のお勉強ですね。
『(省略)』部分が不明なのでこれ以上のアドバイスは出来ません。
とにかく2進数は使えません。16進数などで指定して下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- 電子書籍 中学校のギガスクールPCでTikTokとかサイトを見ようとするとブロックされます。ブロックされずに見 5 2022/05/13 17:12
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
DPマッチング
-
C言語のfor文です。 繰り返しの...
-
配列をnビットシフトする
-
double型の値をchar配列に変換...
-
2曲同時再生するにはどうした...
-
'const char *' 型は 'char *' ...
-
switch文で文字を比較すること...
-
char型からのバイト数取得
-
文字列から空白を取り除きたい...
-
間接操作のレベルとは
-
C言語のポインターで詰まっている
-
絶対パスからのファイル名の切...
-
文字列の中のカンマを消したい
-
javaでunsignedは使えないので...
-
charからLPTSTRへの変換方法
-
C言語の入力した文字を反転させ...
-
AnsiPos相当の関数はありません...
-
構造体の各メンバにfor文からア...
-
c++ 文字列を入力して、一文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
str系関数を使わずに二つの文字...
-
間接操作のレベルとは
-
int main()の・・・
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
switch文で文字を比較すること...
-
テキストデータをそのままバイ...
-
Win32APIでのエディットボック...
-
double型の値をchar配列に変換...
-
干支のプログラム
-
コンパイルエラー invalid ope...
-
間接参照のレベルが異なっています
おすすめ情報