読者です 読者をやめる 読者になる 読者になる

2進変換テスト。C言語版


最初 Java で作ってたんですが、変換したい型の数だけメソッドのオーバーロードが必要なのか?という疑問から
ならば C で void 型使って同等関数書いてみようということになって。


実際に作ってみたら void から型サイズは得られないから引数で渡してもらったり、
整数変換時は受け取り時にキャストしてもらうことが規定事項だったり。


関数量を抑えようとすると、どうしても利用者に前提条件とか強いてしまうので、
使い勝手を考慮すると結局、オーバーロードやラッパー関数で利用し易くすべきなんだろうなと感じました。


つまり、どっちもどっちという結論だったと。
…なんか禅問答みたくなってきた(藁)。


bitStrTest


main.c

/*
* 
* bitStrTest
* 
* author DumBo
* version 0.01 (Jun 16, 2012)
* 
*/

#include <stdio.h>
#include <string.h>
#include <limits.h>

#define BIT_MASK (1)
#define BIT_MAX (sizeof(long) * CHAR_BIT)

const char *varToBitStr(const void *var, const size_t size);
const long bitStrToVar(const char *bitStr);

int main(void) {
	
	char var;
	
	for(var = 0;;var++) {
		printf("var -> bitStr -> var: %d -> %s -> %d\n", 
			var, varToBitStr(&var, sizeof(var)), 
			(char)bitStrToVar(varToBitStr(&var, sizeof(var))));
	}
	
	return 0;
	
}

const char *varToBitStr(const void *var, const size_t size) {

	static char str[BIT_MAX + 1];

	int bit;
	long temp;
	int index;

	if(var == NULL) {
		printf("var null pointer");
		while(1) {
		}
	}
	if(!(size > 0 && size <= sizeof(long))) {
		printf("var size error");
		while(1) {
		}
	}

	bit = size * CHAR_BIT;
	temp = *(long *)var;
	memset(str, 0, sizeof(str));

	index = 0;
	while(bit > 0) {
		sprintf(&str[index++], "%1d", (temp >> --bit) & BIT_MASK);
	}
	
	return str;
	
}

const long bitStrToVar(const char *bitStr) {

	int bit;
	long var;
	int index;

	if(bitStr == NULL) {
		printf("bitStr null pointer");
		while(1) {
		}
	}
	bit = strlen(bitStr);
	if(!(bit > 0 && bit <= BIT_MAX)){
		printf("bitStr size error");
		while(1) {
		}
	}
	index = 0;
	while(bit > 0) {
		if(!(bitStr[index] == '1' || bitStr[index] == '0')) {
			printf("bitStr number error");
			while(1) {
			}
		}
		index++;
		bit--;
	}

	bit = strlen(bitStr);
	var = 0;
	index = 0;
	while(bit > 0) {
		var |= ((bitStr[index++] == '1') ? 1:0) << --bit;
	}
	
	return var;
	
}