■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
きれいなコードを書きませう
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 に相当する数字があれば、
整数全てが表現できる、ってことだよ。

表現力が無くて悪かったよ。