トップページ⇒tech
123コメント26KB

10進数を16進数に変える方法について

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
誰か変換の方法教えて下さい。
0053デフォルトの名無しさんNGNG
>>52
mainが一番気に入った。他のコードはちょっと・・・
005452NGNG
一番どうでもいいトコロが気に入られた(;´Д`)ウツダ
0055デフォルトの名無しさんNGNG
%X 使っちゃダメなの?
0056デフォルトの名無しさんNGNG
>>52
バッファは呼び出し元で確保させとけ、みたいな。
それだけでスレッドセーフって感じ?
0057デフォルトの名無しさんNGNG
void toHex(int s, char *d){
for(;s>0;s/=16)*d++=s%16+(s%16<10?48:55);*d='\0';
}

左右逆だしマイナス未対応だし。
誰かなんとかしる。
0058ビル・ジョブスNGNG
sscanf()じゃだめなの?
0059デフォルトの名無しさんNGNG
標準関数は使わないという方向で。
0060ビル・ジョブスNGNG
でも、>>57のいうマイナス対応や小数点付きや指数表現、
そしてオーバーフローなんかを考えたらsscanf()、sprintf()のほうが
トータルコストが低いと思われ。まず仕様を規定したら。
0061 NGNG
問題が何通りかに解釈できるけど
「10進数字を16進数字に変える」しか正しい問題は無いよな?
内部で10進で持ってるとか思ってそうな>>1だな。
0062デフォルトの名無しさんNGNG
なんつーか、たまにこういうコードを書いてると
なんかほっとするというかさ。
クロスワードとかナンクロとか好きな奴の気持ちが
理解できる瞬間だったりするよな。
0063デフォルトの名無しさんNGNG
ADD命令とDAA(デシマルアジャスト)命令をうまく使うのだ。
0064デフォルトの名無しさんNGNG
書き捨てのコードならこんな感じ?
void UInt2Hex(unsigned u,char *p,int c)
      {for(*(p+=c)='\0';c--;u>>=4)*--p="0123456789ABCDEF"[u&0xF];}
unsigned Dec2UInt(char *p)
      {unsigned u=0;while(*p!='\0')u=u*10+*p++-'0';return u;}
void Dec2Hex(char *d,char *h,int c)
      {UInt2Hex(Dec2UInt(d),h,c);}
0065たった3ステップの技法NGNG
1.まず、「10進数」と打つ。
2.「0」を消す。
3.代わりに「6」を挿入。以上。
 ※全角の6なので注意されたい
006665NGNG
げげ、>>23でガイシュツだった。逝ってきます。
0067デフォルトの名無しさんNGNG
unsigned int a; (32bitととりあえず規定)
これを16進表記の文字列に変換したときに何桁になるかを
あらかじめ知りたいときは どう計算すれば桁数出てくるのかな?

昔トリッキースレで最上位に立ってるビットの位置を調べるとかいう
技があった記憶があるけどそれの応用でいけるかな?
0068とにかく即答NGNG
>>67
 log10(a)
0069デフォルトの名無しさんNGNG
log(a)/log(16)だろ
0070デフォルトの名無しさんNGNG
対数使わずに手で計算 ってのを考えてみるよ。
整数だけで済ましたいっつーかさ。
0071とにかく即答・失敗NGNG
あ! 10進と読み間違った >>69

効率的にやるなら、整数でバイナリ検索が一番効率的だと思う
if (a>=(16<<4)) {
if (a>=(16<<6)) {
・・・みたいに8分割して
0072とにかく即答・失敗NGNG
pascalコードなら見つけた
http://pc.2ch.net/tech/kako/1003/10035/1003559977.html


function iLog2(m:integer):integer; //m=2^n を与えて nを返す
begin
   if m>=$10000 then Result:=iLog2(m shr 16)+16
else if m>=$100 then Result:=iLog2(m shr 8)+8
else if m>=$10 then Result:=iLog2(m shr 4)+4
else if m>=4 then Result:=iLog2(m shr 2)+2
else if m>=2 then Result:=iLog2(m shr 1)+1
else Result:=0; //1か0 0ならエラーだけど知らない
end;

これを 調整すればいいんでない?
0073デフォルトの名無しさんNGNG
というわけで、こういうのを考えてみた。

int log16(unsigned int a){
return a<0x10?1:a<0x100?2:a<0x1000?3:4;
}

4桁分までしか書いてないけどこれを8桁分まで書けばいいか。
0074デフォルトの名無しさんNGNG
ポイントは 0 でも一桁つかう ってところか?
0075デフォルトの名無しさんNGNG
4ビットずつ右に落としていき、0になるまでの回数を数える。
0の場合のみ例外として、1桁プラス。
0076デフォルトの名無しさんNGNG
>>73 >>75
その場合8回の比較が必要になる バイナリ検索にすれば半分に減らせる

けど、予測分岐されるCPUなら>>75 が正解かな
0077デフォルトの名無しさんNGNG
>>76
バイナリ検索でも8回いるんじゃない?
007876NGNG
ごめん 線形検索なら平均4回で最悪8回だね

バイナリ検索なら常に3回だから 速いとも言えないかも

a>=(16<<4)?
(
 a>=(16<<6)?
 (
  a>=(16<<7)?  (8):(7)
 ):(
  a>=(16<<5)?  (6):(5)
 )
):(
 a>=(16<<2)?
 (
  a>=(16<<3)?  (4):(3)
 ):(
  a>=(16<<1)?  (2):(1)
 )
)
0079デフォルトの名無しさんNGNG
一回目 16ビット落し
二回目 16±8
三回目 16±8±4
で比較3回か。
0080デフォルトの名無しさんNGNG
>>78
おれの勘違いかも知れんけど、そのコード変じゃない?
16進にしたときの桁数ってそれじゃ求まらんような。
シフト数が変じゃない?
0081デフォルトの名無しさんNGNG
そんなことよりちょっときいてくれよ

>2はわかるとしても
>3 日本デーも三国志...三国志が日本? ハア?
>4 3つでーも四国....四国が3つ? 何が?
>5 4人でーも後藤マキ..後藤マキが4人?
全然できてないじゃん

>7 1本目と8本目の間を数え忘れてる
0082とにかく即答・失敗NGNG
即答ミスしたお詫びに分岐無しバージョンで

function HexLength(a:Cardinal):Integer;
begin
a := a or 1;
a := a or (a shr 16);
a := a or (a shr 8);
a := a or (a shr 4);
a := a or (a shr 2);
a := (a or (a shr 1)) and $11111111;
a := a+(a shr 16);
a := a+(a shr 8);
a := a+(a shr 4);
Result:=( a and $f);
end;
008378NGNG
>>80
ガーン! 確かに間違い。 16<<n を 1<< (4*n) に置換して
008478NGNG
>>82 面白そうだから Cに翻訳

int HexLength(unsigned a)
{
a = a | 1;
a = a | (a >> 16);
a = a | (a >> 8);
a = a | (a >> 4);
a = a | (a >> 2);
a =(a | (a >> 1)) & 0x11111111;
a = a + (a >> 16);
a = a + (a >> 8);
a = a + (a >> 4);
return a & 0xf;
}

誰か検証してみて
0085とにかく即答・失敗NGNG
こんなコードで一応 正しいかどうかは 検証してるよ

begin
Randomize;
for i:=0 to 1000000 do begin
a:= Random(High(Cardinal));
n1:=HexLength(a);
n2:=Length(Format('%x',[a]) );
if n1<>n2 then begin
writeln(Format('%8X : %d %d',[a,n1,n2]));
end;
end;
end;
0086デフォルトの名無しさんNGNG
printf("10進=%d 16進=%x\n",aa,aa);
0087デフォルトの名無しさんNGNG
乱数か…
0088デフォルトの名無しさんNGNG
スレの方向を見失いました。
0089デフォルトの名無しさんNGNG
#include "../Library/lib.c"

int i = htoi("0xFF");

俺の環境だけです、他人は知りません。
0090デフォルトの名無しさんNGNG
>>89
ちょっとまった。その程度ならstrtolを使えば済む話だよね。
0091デフォルトの名無しさんNGNG
>>18
右手親指を基点として、
折った指を1としたとき、
10進数で8を表現しようとすると
指が痛い。
0092デフォルトの名無しさんNGNG
0x14のほうがつらい。
つか、8は痛くないぞ、
0093デフォルトの名無しさんNGNG
>>92
グワシage
0094デフォルトの名無しさんNGNG
>>91
ちょっとまった。普通は指を立てたほうが1じゃないのか?
人前で0x04やると殺されるけど。
0095デフォルトの名無しさんNGNG
>>93
禿藁wwww
0096デフォルトの名無しさんNGNG
>>94
普通は指折り数えない
0097デフォルトの名無しさんNGNG
ごめんなさいミスりました。

#include "../Library/lib.c"
char s[256];
itob(1000,s,16);

俺の環境だけです、他人は知りません。
0098棄教者 ◆witdLTi2 NGNG
>>96
普通の人は指折り数えるけど二進法で数えることはしない。
したがって指の形が0x04になることもない。
0099デフォルトの名無しさんNGNG
普通は指折り数えないか?
0100デフォルトの名無しさんNGNG
ナゼか右手では出来ん。
左手だとやたら早く数えられる。

二進指折り31まで早数え大会を開催しませう。
0101デフォルトの名無しさんNGNG
>>98 みっけた
http://pc.2ch.net/test/read.cgi/linux/1007137554/83
0102デフォルトの名無しさんNGNG
漏れの熱い10進数を君の勇気で16進数に変えるんだ!!
0103デフォルトの名無しさんNGNG
質問の意味よくわかんない。
"0123456789abcde"[x]じゃだめ?
0104デフォルトの名無しさんNGNG
10 INPUT A
20 IF A<=9 THEN PRINT A
30 IF A=10 THEN PRINT"A"
40 IF A=11 THEN PRINT"B"
50 …
0105デフォルトの名無しさんNGNG
>>100
約13秒。右手。
0106デフォルトの名無しさんNGNG
>>103
駄目かどうか聞く前に、まずは過去の書き込みと
自分のレスの内容を再度確認したほうが良いのでは?
0107デフォルトの名無しさんNGNG
>>105
俺、53秒かかった・・・
0108デフォルトの名無しさんNGNG
4ビット1桁とする10進数の浮動小数のクラスを作り
普通のINTやFLORTにキャストしろってことかな?
0109デフォルトの名無しさんNGNG
>>103
xが15だとエラーになるねそれ・・・
0110デフォルトの名無しさんNGNG
エラーというか、'\0'になるのでは。
0111デフォルトの名無しさんNGNG
もういいやん…
終わりにしようや。このスレ。
0112デフォルトの名無しさんNGNG
>>108
いや、それやるなら内部ではふつーのfloatなりdoubleなりでいいだろ・・・
0113デフォルトの名無しさんNGNG
もう少し 仕様をハッキリしてくれよ >>158
   それと平均ではダメな理由も

ところで>>121が言ってるような 16bit の2ドット同時に処理する コード希望 
0114デフォルトの名無しさんNGNG
>>113
激しく誤爆の予感
0115デフォルトの名無しさんNGNG
>>113
おそらく小技スレへのレス
0116デフォルトの名無しさんNGNG
>>115
はっきり、間違ったって白状しろよ
0117113NGNG
ゴメン 俺が間違った。
 115は俺ではない。とにかくスマン
0118デフォルトの名無しさんNGNG
CでBCDにナイスに変換する方法を教えて!
0119無責任だがNGNG
>>118
BCDっていうのは4bit単位に10進数で表現するコードの事?

 例 数1234 を 0x1234 とする

なら もう判ると思うけど 数を10進表現して それを16進として読めばよい
0120デフォルトの名無しさんNGNG
>>119
ナイスかどうかは知らんけど、これでいいか ?

char s[64];
char *dummy;
sprintf(s, "0x%d", x);
x = strtol(s, &dummy, 16);
0121無責任だがNGNG
俺に聞かれても >>120

パソコンならそれでいいと思う。
BCDとか言うのは組込屋さんの仕事だろうから色んな制限があるだろうし
0122デフォルトの名無しさんNGNG
>>118
こういう奴以外でって事?
void UInt2Bcd(char *b,int l,unsigned u)
      {for(b+=l;l--;u/=10)*--b=(char)(u%10);}
0123118NGNG
やっぱ普通に処理するしかないのかなぁ
割算とか嫌だなぁ…

答えてくれた皆さんありがとう。
■ このスレッドは過去ログ倉庫に格納されています