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

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

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

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

Q&A

解決済

2回答

9505閲覧

ビット操作で指定したビットをオン、オフさせる方法が解らない

kinu221

総合スコア26

C

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

0グッド

1クリップ

投稿2017/07/21 14:37

こんばんは、プログラミング初心者です。
8ビットの任意のデータに対し、以下の操作を行うプログラムを組んでいます。
・任意場所のビットをクリア(0にする)する関数bit_off
・任意場所のビットをセット(1にする)する関数bit_on
また、操作結果が確認できるように2進数で表示を行う関数DectoBinを組む。

しかし、指定したビットをオン、オフさせるプログラム(bit_off,bit_on)が解らず、組むことができませんので、教えていただきたいです。
また、ビット操作の結果を2進数で確認するプログラムも2進数で表示はできるのですが元データと違う値が表示され※、その原因が解らないので
合わせて回答をお願い致します。
※例えば、元データを255と入力すると値が00110010と表示されます。期待値としては11111111が表示されるようにしたいです。
--------------------ソースコード----------------------------------------------------------
#include <stdio.h>

/ビットクリア、セットの定数定義/
#define BIT_CLEAR 0
#define BIT_SET 1

/プロトタイプ宣言/
unsigned char bit_off(unsigned char data, int pos);
unsigned char bit_on(unsigned char data, int pos);
void DectoBin(unsigned char data);

int main(void)
{
unsigned char ucData; //元データを格納する変数
int Ope; //操作方法を格納する変数
int Pos; //操作箇所ビットを格納する変数

printf("元データ(0~255):"); scanf("%s", &ucData); printf("操作方法(0:クリア/1:セット):"); scanf("%d", &Ope); printf("操作箇所ビット(7/6/5/4/3/2/1/0):"); scanf("%d", &Pos); printf("変更前:"); DectoBin(ucData); if(Ope == BIT_CLEAR){ printf("変更後:"); DectoBin(bit_off(ucData,Pos)); }else{ printf("変更後:"); DectoBin(bit_on(ucData,Pos)); }

}

/操作箇所ビットで指定したビットをオフにする関数/
unsigned char bit_off(unsigned char data, int pos){
unsigned char ucRet; //ビット操作した結果を格納する変数

return ucRet;

}

/操作箇所ビットで指定したビットをオンにする関数/
unsigned char bit_on(unsigned char data, int pos){
unsigned char ucRet; ////ビット操作した結果を格納する変数

return ucRet;

}

/ビット操作の結果を2進数で表示する関数/
void DectoBin(unsigned char data){
char i = 0;

for ( i = 7; i >= 0; i--) { putchar(data & 1 << i ? '1' : '0'); } putchar(' '); putchar('\n'); return;

}
--------------------ここまで-------------------------------------------------------------------
ビット操作のオン、オフ処理に関しては丸投げになってしまい、申し訳ありません。

ご回答をお待ちしております。
以上

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

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

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

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

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

guest

回答2

0

ベストアンサー

元データをx、位置を指定する変数をposとします。

x | (1 << pos)
でON

x & ~(1 << pos)
でOFF
ができます。

2進数表記関数はまずご自身でデバッグしてみたらいいと思います。

投稿2017/07/21 15:26

HogeAnimalLover

総合スコア4830

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

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

majiponi

2017/07/21 22:37

元データの入力、%sじゃマズイよ、ってのも書いてあげては?
kinu221

2017/07/22 04:44

回答を頂いたものを基にプログラムを修正してみましたが、2進数表記はうまくいきましたが、ビットオン、オフはうまくいきませんでした。 ----------------------------ソースコード--------------------------- /*操作箇所ビットで指定したビットをオフにする関数*/ unsigned char bit_off(unsigned char data, int pos){ unsigned char ucRet; //ビット操作した結果を格納する変数 ucRet=data|(1 << pos); return ucRet; } /*操作箇所ビットで指定したビットをオンにする関数*/ unsigned char bit_on(unsigned char data, int pos){ int ucRet; ////ビット操作した結果を格納する変数 ucRet=data&~(1 << pos); return ucRet; } /*ビット操作の結果を2進数で表示する関数*/ void DectoBin(unsigned char data){ int i; for ( i = 7;i >= 0; i--) { putchar(data &(1<<i) ? '1':'0'); } putchar(' '); putchar('\n'); } ----------------------------------------------------------------------------------------
ozwk

2017/07/22 04:51

on/off逆になってますよ
guest

0

scanfについては見落としていました。が、気づいていただけたようで幸いです。

投稿2017/07/22 07:55

HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問