■掲示板に戻る■
■過去ログ倉庫めにゅーに戻る■
きれいなコードを書きませう
- 1 名前: お題1 投稿日: 2001/04/17(火) 22:49
- 入力された値を2進数で表示しなさい。
- 2 名前: これでイッパイイッパイ… 投稿日: 2001/04/17(火) 23:01
- #include<stdio.h>
#define BITS 32
int main(void)
{
int x;
int i;
char str[BITS+1];
scanf("%d",&x);
for(i=0;i<BITS;i++)
str[BITS-1-i] = x&(1<<i)?'1':'0';
str[BITS] = 0;
printf("%s\n", str);
return 0;
}
- 3 名前: デフォルトの名無しさん 投稿日: 2001/04/17(火) 23:12
- >>1
'b'(=binary)を解釈するprintf作れ
myprintf("%b\n",100);
->1100100
- 4 名前: デフォルトの名無しさん 投稿日: 2001/04/17(火) 23:21
- bitdump(void *ptr,int bits)
{
int i;
for(i=bits;i>0;i--)
putch('0'+(ptr[i>>3]&(1<<(i&7))));
}
- 5 名前: デフォルトの名無しさん 投稿日: 2001/04/17(火) 23:27
- >>4
ちゃんとコンパイルしたのか?
void*型の配列参照なんてできないはずだが。意味も違ってるし
- 6 名前: デフォルトの名無しさん 投稿日: 2001/04/17(火) 23:37
- とりあえずベタでやってみました。
main(int argc,char* argv[]){
int value,i,flag = 0;
char str[33]; str[32] = 0;
if(argc!=2)return;
value =atoi(argv[1]);
if(value < 0 ){value= 0 - value ;flag = 1;}
for(i = 31 ;value!= 0;value =(value >> 1), i-- )
{str[i] = '0' + value%2 ;}
if( flag ){str[i]='-';printf(&str[i]);}
else printf(&str[i+1]);
}
- 7 名前: not 4 投稿日: 2001/04/17(火) 23:40
- >>5
確かにコンパイル通らなかったよ…
bitdump(int *ptr,int bits)
...
int x = 30;
bitdump(x, 32);
にしてコンパイル通したけどちゃんと動かなかった…
つかさっぱり理解できない…
俺が馬鹿だからなのか?
- 8 名前: 1(初心者) 投稿日: 2001/04/17(火) 23:42
- >>3
可変引数から勉強しなきゃ(汗
鬱だ私脳
- 9 名前: デフォルトの名無しさん 投稿日: 2001/04/17(火) 23:45
- 1のお題は標準入出力に限定してないだろ?
int value = InputIntValue();
ShowString(IntToStrAsBinary(value));
関数の中身は後で考えよっと
- 10 名前: デフォルトの名無しさん 投稿日: 2001/04/17(火) 23:51
- なんだ。
きれいなコードを書く規約について話し合うスレかと思ったら
学校の宿題をやってもらうスレか。
- 11 名前: 1(ツマルじゃないよ) 投稿日: 2001/04/17(火) 23:58
- >>10
学校の宿題じゃないよう。
http://piza.2ch.net/test/read.cgi?bbs=tech&key=987485622&ls=50
を見てきれいに書いてみようと思ったのだよう。
でもあんまりきれいに書けなかったからスレ立ててみたのだ。
つか学校の宿題でこんなことわからない奴は「可変引数」って言葉自体知らないだろうよう。
- 12 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 00:03
- >>6
あんまりきれいじゃないような。
それとprintf(&str[i]);って
printf(str+i)じゃだめなの?
- 13 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 00:05
- >>2 みたいな入力、出力とメインの処理を同じ関数のなかに
書く programmingってのはだれが普及させたんだ?
たまに見るけど、BASICの頃を思い出させて鬱。
void printbin(unsigned int n, FILE *out) {
if (n) printbin(n>>1, out);
putc((n&1)? '1' : '0', out);
}
ネタいぜ
- 14 名前: 2 投稿日: 2001/04/18(水) 00:09
- >>13
スマンね。
短いから別にいいかなと。
- 15 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 00:11
- >>12
同じ事だろ
- 16 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 00:19
- >>13
すっげーきれい
- 17 名前: ツマル 投稿日: 2001/04/18(水) 00:33
- #include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *bin8(int bin);
int main(int argc, char *argv[])
{
int bin;
if(argc != 2){
printf("コマンドの入力形式が間違っています.\n");
return(1);
}
bin = atoi(argv[1]);
printf(">>>%s\n", bin8(bin & 0xFF));
printf(">>>%s\n", bin8((bin >> 8) & 0xFF));
printf(">>>%s\n", bin8((bin >> 16) & 0xFF));
printf(">>>%s\n", bin8((bin >> 24) & 0xFF));
return(0);
}
char *bin8(int bin)
{
static char
result[10];
int i1;
result[8] = '\0';
for(i1 = 0; i1 < 8; i1++){
if(bin % 2 == 0)
result[(8-1)-i1] = '0';
else
result[(8-1)-i1] = '1';
bin = bin / 2;
}
return(result);
}
- 18 名前: よっぱらいなてんさいぷろぐらむぁ(偽) 投稿日: 2001/04/18(水) 00:41
-
void OutBit(unsigned int uDec, FILE *Out)
{
unsigned int uBit;
uBit = 1U << (sizeof(uBit;) * 8);
while(uBit >> 1){
fputc((uBit & uDec) ? '1' : '0', Out);
}
}
/*
つーかよっぱらいだから頭まわらないにょ
おおまちがいや無駄が多いかもでにょ
もうねるにょ〜
*/
/*
>>13
つーか1ビットごとに再起は速度がきになるにょ
再起の悪い例のような・・・
*/
- 19 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 00:49
- >>18
おお、エレガントやぁ
- 20 名前: よっぱらいなてんさいぷろぐらむぁ(偽) 投稿日: 2001/04/18(水) 00:50
- void OutBit(unsigned int uDec, FILE *Out)
{
unsigned int uBit;
uBit = 1U << (sizeof(uBit) * 8);
while((uBit >> 1)){
fputc((uBit & uDec) ? '1' : '0', Out);
}
}
/*
あるこーるがぷっぷくぷ〜♪
*/
- 21 名前: よっぱらいなてんさいぷろぐらむぁ(偽) 投稿日: 2001/04/18(水) 00:55
- 全然関係ないけどあるこーるってこわいっす。
さっきフロッピーのけーすふんずけた足が痛いなぁと思ってたら
ざっくり切れてて床が血の海になってたよーん
がむてーぷはってから寝よう・・・
- 22 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 00:58
- >>20
uBit = 1U << (sizeof(uBit) * 8);って0になるよ。
- 23 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 00:59
- ところで、上にあげたソース、ちょっと書き換えただけで
他のN進数に対応できますか?
例えば4進数、8進数、16進数とかに。
16進数の場合は、数字以外に文字が関係してきますから、
その対処をしなきゃならいと思いますが。
- 24 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 01:10
- char *itobin(int n, char *buf, int sizeofbuf)
{
char *ret = buf + sizeofbuf;
*--ret = '\0';
do{
*--ret = (n & 1)?'1':'0';
n /= 2;
}while(n>0);
return ret;
}
int main(int argc, char* argv[])
{
char buf[256];
printf("%s", itobin(5, buf, sizeof(buf)));
return 0;
}
>23それはほんとの厨房レベル。綺麗も糞もない。
- 25 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 01:10
- >>23
簡単なのは"0123456789abcdef"
で2-16まで対処するとか。
- 26 名前: 24 投稿日: 2001/04/18(水) 01:13
- *--ret = (n & 1)?'1':'0';
は
*--ret = '0' + n & 1;
のがクレバーで良いかも(藁
- 27 名前: よっぱらいなてんさいぷろぐらむぁ(偽) 投稿日: 2001/04/18(水) 01:16
- >>22
布団に入ってから気が付いて見てみたら・・・
ナイス突っ込み!!
引数はunsigned charとかより低いビット数ぢゃなきゃだめだねぇ
読みだし用の変数がでかくないと超えちゃいますわな
スマソ
- 28 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 01:21
- dispbin(int n)
{
char buffer[32];
_itoa(n, buffer, 2);
printf("%s", buffer);
}
- 29 名前: 28 投稿日: 2001/04/18(水) 01:22
- これが一番マトモだろ。
>入力された値を2進数で表示しなさい。
なんだから 藁
- 30 名前: よっぱらいなてんさいぷろぐらむぁ(偽) 投稿日: 2001/04/18(水) 01:25
- /*
ああ変なことかいてるなー
一応修正(よっぱらいだからまだ間違えてるかも)
つーか本当に寝る
*/
void OutBit(unsigned int uDec, FILE *Out)
{
unsigned int uBit;
uBit = 1U << ((sizeof(uBit) * 8) - 1);
do{
fputc((uBit & uDec) ? '1' : '0', Out);
}while((uBit >> 1))
}
- 31 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 01:29
- N進数に対応版
ただし、正の整数のみ対応。
マイナスは・・・気にするな(笑)
#include <stdio.h>
#include <string.h>
#define N 2 // N (<10) 進数を決める
int main(void)
{
char n[20];
int x, i=0;
printf("Input x > ");
scanf("%d",&x);
if(x < 0)
return(1); // マイナスは無視
while(x != 0) {
n[i] = (x%N)+48; // ASCII コードに対応させる
x /= N;
i++;
}
for(i--; i >= 0; i--)
printf("%c",n[i]);
printf("\n");
return(0);
}
- 32 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 01:30
- >>24
同じ事だけど
n /= 2よりも
n >>= 1のほうが意味も分かりやすいし
きれいなコードって意味ではいいんじゃないかな。
重箱の隅をつっつくようなレスでスマソ。
- 33 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 01:31
- >>28,29
おお、スゲ。
っていうか、このお題でこれ以外の回答してる奴は逝ってよしだな。
現場でこれ以外のコード書いたら保守大変なだけだぞ
- 34 名前: よっぱらいなてんさいぷろぐらむぁ(偽) 投稿日: 2001/04/18(水) 01:35
- 本当に寝る前の最後の書き込み
>>32
みて気が付いたけど
>>30は
((uBit >> 1)) -> ((uBit >>= 1)) だね欝だ・・・
>>33
つーかこれって宿題お勉強スレでしょ?
- 35 名前: よっぱらいなてんさいぷろぐらむぁ(偽) 投稿日: 2001/04/18(水) 01:37
- 読み出しビットはループで初期化で
- 36 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 01:39
- これでジ・エンド?
- 37 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 01:47
- >>34
>入力された値を2進数で表示しなさい。
条件はコレだけじゃん。
これ以上の要求は皆無
- 38 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 01:49
- みんなボクの宿題手伝ってくれてありがとう
- 39 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 02:00
- >>28-29=>>33=>>37
寒い。
- 40 名前: みさきち 投稿日: 2001/04/18(水) 02:04
- なぁ、1進数ってどんなん?
- 41 名前: 知ったか君 投稿日: 2001/04/18(水) 02:06
- >>40
多分0の個数で表すんだよ(ワラ
1->0
6->000000
- 42 名前: 知ったか君 投稿日: 2001/04/18(水) 02:09
- いや、0を使わなくてもいいんだろうけど
10進数->10増えるごとに桁が増える
2進数->2増えるごとに...
1進数->1増えるごとに...
だよ。
- 43 名前: みさきち 投稿日: 2001/04/18(水) 02:09
- あっ、やっぱり・・・。それじゃ何が何だか分かりませんね(笑)
- 44 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 02:11
- >>42
ですから、1増えるごとに桁が増えていくんですけど、
それをどうやって表すんですか?
2進数の時点で1と0しか使われていないんですから、
1進数になったら・・・。
- 45 名前: 知ったか君 投稿日: 2001/04/18(水) 02:12
- >>44
>>41で書いたみたいに...(ワラ
- 46 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 02:13
- いーみなーいじゃーん(笑)
- 47 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 02:14
- だっ、誰か!
0の発見に続く大発見!
1進数を発見してくれ!
- 48 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 02:54
- 0でない値を表記しようしたら「無限回」繰り上がっちまうぞ。
発見したはよいが、つかいもんにならん。
0と0以外しか区別できん。
#ん?Boolean?
- 49 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 02:58
- ん?ブーリン?飛んでブーリン?
なんてボケは置いておいて。
ブール型変数だって結局のところ0と1、
もしくは true false なんでしょ?
だったら2進数みたいなもんじゃん。
- 50 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 03:16
- 2進数「の1つのケタ」がBooleanなのでわ?
1進数だと、全ケタを使ってソレだけしか表現できない
んでわないかなと…というのが前述の主旨。
- 51 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 03:59
- >>48
無限回繰り上がる?
>>41-42みたいになるんじゃないのか?
- 52 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 04:36
- >2進数「の1つのケタ
それが0と1で構成されているわけでしょ?
んで、1進数いうたら1増えたら桁があがるわけじゃん。
やっぱりずっと0じゃん。
- 53 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 04:46
- n進数m桁で表現できる数はn^m(nのm乗)。
だから、1進数だと1^m=1で、1種類の数しか表現できない。
- 54 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 04:50
- 1進数は無いということで。
- 55 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 04:55
- >>53
まあ、それはそうなんだけど…。
>>41
は惜しいなあ。その表記法で0と1さえ区別できれば。
- 56 名前: 13 投稿日: 2001/04/18(水) 04:59
- >>13 誰も突っ込まないけど、あれ、bugがあるぞ。
0を表示できない(w
- 57 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 05:43
- >>56
表示できるぞ?
- 58 名前: 知ったか君 投稿日: 2001/04/18(水) 06:11
- >>53-54
そういうものか…
>>41の訂正(?)なんだけど
1->0
6->000000
じゃなくって
0->0
1->00
6->0000000
の間違いですね。多分。
いや、どっちにせよ間違ってる(ないのなら)んだろうけど。
- 59 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 06:46
- >>58
> 0->0
> 1->00
> 6->0000000
むしろ、0のとき何も書かないって方が徹底している。
0 -> ''
1 -> '0'
2 -> '00'
:
これで小数とか考えなければ表現法としてはありうるけど、
結局は'0'の個数で自然数を表しているに過ぎないわけ。
- 60 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 07:44
- つまり指折り数えてるわけね(w
- 61 名前: 知ったか君 投稿日: 2001/04/18(水) 08:16
- >>59
> むしろ、0のとき何も書かないって方が徹底している。
> で小数とか考えなければ表現法としてはありうるけど、
> は'0'の個数で自然数を表しているに過ぎないわけ。
二進数や十進数とか他のn進数の法則を自然に一進数に適用すれば
あなたの言うようにはならないと思うよ。
- 62 名前: 132人目の素数さん 投稿日: 2001/04/18(水) 08:42
- http://cheese.2ch.net/test/read.cgi?bbs=math&key=987540711
- 63 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 08:57
- 数学板は電波の巣窟ってことですか?
- 64 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 11:20
- m進数、という言葉の通常の定義から、n桁のm進数では
m^n 通りの数が表現できるので、1進数だと何桁使っても
1 つの数(0ね)しか表現できない。
一進数には、0 という一つの数字しか存在し得ないってこと。
あまり実用的ではないと思う。
数字を表す記号の数=基数じゃなくても良いなら、ローマ数字
みたいな位取りの概念の無い記数法として存在するけど。
- 65 名前: 知ったか君 投稿日: 2001/04/18(水) 12:28
- >>64
まあ確かに
00も000も00000000000000も
1でなく2でもなく13でもなく0だよな(ワラ
- 66 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 14:13
- >>51
ならん。
>>52
>んで、1進数いうたら1増えたら桁があがるわけじゃん。
>やっぱりずっと0じゃん。
そう。「ずっと」0なの。0の数は無限個。
1増えて桁が繰り上がると、その次の桁が1(2以上進数)になるけど、
するとその桁がまた繰り上がりしないとならん。
以下、無限繰り返し。だべ?
- 67 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 17:40
- ツマルタン、ハァハァ・・・
- 68 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 03:03
- >>61
> 二進数や十進数とか他のn進数の法則を自然に一進数に適用すれば
> あなたの言うようにはならないと思うよ。
自然な拡張では一進法は0以外表せないのだから、人工的に回避するしかないということ。
人工的ならば利便性から何種類も考えられるわけだ。
たとえば0で表すのをやめて1を用いるとか…。そうすると>>59と似たり寄ったりだが、
0 -> ''
1 -> '1'
2 -> '11'
:
ってな具合だ。とにかく一般のm進法にさらに新しい約束事を取り入れなければ
うまくいかないだろう。
- 69 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 03:44
- 0ってもともと無いものを表記するためにあるもんじゃないの?
つまり、0が続く数値というのは、無いということで、
1進数は無い!んじゃないの?
- 70 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 04:00
- >>69
とっくにそのような結論に至ってると思われ。
- 71 名前: 知ったか君 投稿日: 2001/04/19(木) 04:02
- >>68
うん。そうだね。まあ無いってことだね。
- 72 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 04:10
- 0 -> '0'
1 -> '1'
2 -> '11'
ではDaMe?
- 73 名前: 知ったか君 投稿日: 2001/04/19(木) 04:26
- >>72
やっぱそうなるのかねぇ?
でも0に1足して桁(位)あがらないってのはなんかねぇ。
- 74 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 04:42
- >>72
m進法ならばm種類の記号しか用いないのでわ?
- 75 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 04:54
- 0進数とか-1進数とかi進数は、どうなるの?
- 76 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 04:58
- >>75
あのぉ、0進数って矛盾してません?
だって、進数という部分集合に入りませんよ?
- 77 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 05:10
- >>74
一般論で言えばそうだけど、
理論的には「記号の数 ≧ 位取りの基数」なら良いの。
たとえば、ソロバンは10進数だけど記号は11種類ある。
で、こういう、>>68みたいな「記号の多い1進数」の
例がローマ数字だってことも激しく既出。
>>75
-1 進数は (0,1) の二個の記号を 0 と 1 の意味で用いれば、
任意の整数を表現でき、i進数では真意の整複素数を表現できる。
- 78 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 05:11
- >>77
古いソロバンね。
- 79 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 06:50
- > -1 進数は (0,1) の二個の記号を 0 と 1 の意味で用いれば、
> 任意の整数を表現でき
意味不明
- 80 名前: デフォルトの名無しさん 投稿日: 2001/04/19(木) 07:23
- -1 進数 -> 10進数
0 -> 0
1 -> 1
10 -> -1
11 -> 0
100 -> 1
101 -> 2
110 -> 0
111 -> 1
1000 -> -1
1001 -> 0
1010 -> -2
..
てな感じで、位取りが -1の場合、
0 に相当する数字と、1 に相当する数字があれば、
整数全てが表現できる、ってことだよ。
表現力が無くて悪かったよ。