電脳ヨーグルト(技術ブログ)

勉強したことを淡々とメモしていきます

指定したビットの状態を調べ、値をセットする関数

指定したビットの状態を調べるGetBit関数と指定したビットの値を変更するSetBit関数を作りました。

GetBit関数

0~255までの10進数を8ビットの2進数の文字列に変換し、そのビットの状態を調べる関数。
n番目のビットが1だったらTRUE
n番目のビットが0だったらFALSE

(例)
numが255でbitが3の時
255→11111111
GetBit(num, bit, &onFlg1);
3ビット目は1なのでTRUEを返す

SetBit関数

0~255までの10進数を8ビットの2進数の文字列に変換し、指定したビットの数字を変更する関数。

(例)
numが255でbitが3の時
onFlg2 = FALSE;
255→11111111
SetBit(&num, bit, onFlg2);
onFlg2 = FALSE; なので3ビット目が0に変更される。
num(11111111)がnum(11111011)

#include <stdio.h>
#include <windows.h>
#define STR_LEN (30)
#define ONE_BYTE (8)
/* 関数宣言 */
BOOL GetBit(BYTE num, int bit, BOOL * onFlg);
BOOL SetBit(BYTE * num, int bit, BOOL onFlg);

/* 関数定義 */
BOOL GetBit(BYTE num, int bit, BOOL *onFlg){
	//変数の定義
	DWORD sorce_num, str_len;
	int bin_part;
	char str_f[STR_LEN] = { '\0' };
	sorce_num = num;
	str_len = ONE_BYTE;
	if(bit < 0 || bit > 7){
		printf("bitが0~7の範囲外の場合(Ret = FALSE)\n");
		return FALSE;
	}
	// numを2進数の文字列に変換
	// 変換した文字をstrに格納
	while(str_len > 0) {
		str_len--;
		bin_part = sorce_num % 2;
		if (sorce_num != 0) {
			*(str_f + str_len) = bin_part + 48;
			sorce_num /= 2;
		}
		// 残りの桁を0埋め
		else {
			*(str_f + str_len) = '0';
		}
	}

	*(str_f + ONE_BYTE) = '\0';
	if (str_f[bit] == '1') {
		*onFlg = TRUE;
		printf("GetBit(%d %d %d) ON %s\n", num, bit, *onFlg, str_f);
		return *onFlg;
	}
	else if(str_f[bit] == '0'){
		*onFlg = FALSE;
		printf("GetBit(%d %d %d) OFF %s\n", num, bit, *onFlg, str_f);
		return *onFlg;
	}
	else{
		printf("0か1以外の数字が入ってます");
	}

	if(onFlg == NULL){
		printf("onFlgがNULLの場合(Ret = FALSE)\n");
		return FALSE;
	}
}

/* 関数定義 */
BOOL SetBit(BYTE * num, int bit, BOOL onFlg){
	//変数の定義
	DWORD sorce_num, str_len;
	int bin_part;
	char str_f[STR_LEN] = { '\0' };
	sorce_num = *num;
	str_len = ONE_BYTE;
	if(bit < 0 || bit > 7){
		printf("bitが0~7の範囲外の場合(Ret = FALSE)\n");
		return FALSE;
	}
	// numを2進数の文字列に変換
	// 変換した文字をstrに格納
	while(str_len > 0) {
		str_len--;
		bin_part = sorce_num % 2;
		if (sorce_num != 0) {
				*(str_f + str_len) = bin_part + 48;
				sorce_num /= 2;
		}
		// 残りの桁を0埋め
		else {
			*(str_f + str_len) = '0';
		}
	}
	*(str_f + ONE_BYTE) = '\0';

	if(onFlg == TRUE){
		str_f[ONE_BYTE-bit] = '1';
		printf("SetBit(%d %d %d) ON %s\n", *num, bit, onFlg, str_f);
		return onFlg;
	}
	else if(onFlg == FALSE){
		str_f[ONE_BYTE-bit] = '0';
		printf("SetBit(%d %d %d) OFF %s\n", *num, bit, onFlg, str_f);
		return onFlg;
	}

	if(num == NULL){
		printf("numがNULLの場合(Ret = FALSE)\n");
		return FALSE;
	}
}

void main() {
	BYTE num = 255;
	BOOL onFlg1;
	BOOL onFlg2;
	// bitの数字は0~7
	int bit = 3;
	// 引数で与えたbit番目の文字が1ならonFlg1 = TRUE
	// 引数で与えたbit番目の文字が1ならonFlg1 = FALSE
	GetBit(num, bit, &onFlg1);
	onFlg2 = FALSE;
	// onFlg2 = TRUE の時は、引数で与えたbit番目の文字が1になる
	// onFlg2 = FALSE の時は、引数で与えたbit番目の文字が0になる
	SetBit(&num, bit, onFlg2);
}