1 :
デフォルトの名無しさん :
01/12/02 00:58 誰か変換の方法教えて下さい。
1本デーもにんじん
日本デーも三国志
3つでーも四国
4人でーも後藤マキ
5歳で〜もろくでなしブルース
7またでもヤマタノオロチ
八兵衛でも食いだおれ
クソスレ
倒産
佐藤B作
CCサクラ
decimal ほら、これが10進数を16進数に変える方法だね。
calc.exe
FAQ読め
ある人によると"人間の両手の指の数が10本だから10進数"らしいから、指の数が16本の人間を増やせば16進数に変換できるよ
Windowsの電卓で変換すれば?
人間の指は10本あるから1023まで余裕で数えられるよ
HEX(Num) sprintf(str,"%X",num); go to google;
21 :
デフォルトの名無しさん :01/12/12 00:48
>>1 たとえば、「A6B」。
B = 11
6 = 6 * 16 = 96
A = 10 * 16 * 16 = 2560
11 + 96 + 2560 = 2667。電卓で確認してみて。
つまり・・・。 (換算して出た数(A=10,B=11…) * (16の(ビット目)乗)) + … をビット数分繰り返す。
……電卓使ったほうがはるかに簡単。
マジレスすまん。
22 :
デフォルトの名無しさん :01/12/12 00:52
>>21 おーい、10進数を16進数に変える方法を聞いているんだぞ。それだと逆だろう。
#include <stdio.h> main() { char str[] = "10進数"; puts(str); str[1] = '6'; puts(str); }
>>24 ほんとだ。よく見てんな。
しかしなにゆえに全角になってんだ?
10進も16進もおんなじだ。表記法の違いであって数としてはかわらん。
27 :
デフォルトの名無しさん :01/12/12 01:20
プログラム外でのこととも一言も言っていませんよ?
マターリヽ(´ー`)ノシヨウヨ
マジレスすると、 # ruby -e 'puts "%x" % 10' a
変換したい10進数を商が0になるまで16で割りつづける。 商を求める際には余りを記録しておく。 商が0になったら、余りを後ろから順に並べる。それが答え。 例えば10進数300を16進数に変えるなら 300 / 16 = 18 余り 12(C) 18 / 16 = 1 余り 2 1 / 16 = 0 余り 1 で、下から順に余りを並べたのが答え。 つまり16進数12Cが10進数300になる。
32 :
デフォルトの名無しさん :01/12/12 13:55
a = 300; while (a) { b = a % 16; a /= 16; *buf-- = b + b>9?('a'-10):'0'; }
34 :
デフォルトの名無しさん :01/12/12 15:32
sprintf( buf, "0x%08x", number );
>>32 不吉なコード
かならずよくないことがおこる
36 :
デフォルトの名無しさん :01/12/12 16:15
>>32 × *buf-- = b + b>9?('a'-10):'0';
○ *buf-- = b + (b>9?('a'-10):'0');
bufは、適当なchar配列の後方にポイントしておく(NULのひとつ手前に)
十進数の頭に0xをつければ16真数になるYO! 中学校の数学なら<sub>(16)</sub>って感じだNE!
マッチをデジタル時計のように並べて10を作りました。 マッチを1本だけ動かして16にしなさい。
_ | | ̄| \\ | |_ | |_| // | |_|
てっきり、 | _ \\ |_ | |_| // | |_| だとばっかり‥‥
A=任意の数字として ?HEX$(A) だろ? 桁幅調整したいなら ?RIGHT$("000"+HEX$(A),4) でもいいと思うよ。
̳A;
̳A;
test
46 :
デフォルトの名無しさん :02/03/09 02:03
sprintf(buf,"%x",number); ってついついやっちゃうけど、これってコスト高いんだよね
まず反乱を起こし、独立国家を建てる。 ↓ 諸外国に戦争ふっかけて勝利する。 ↓ 16進数の使用を奨励する。 ↓ 頃合を見て、憲法で10進数使用を禁止する。 ま、がんばってくれ >1
48 :
デフォルトの名無しさん :02/04/12 18:55
つまりあれだ、結局だ〜れも知らない、と・・・・・・
>>46 べつに? 確保すべきbufのサイズも決まってるし
>>49 オーバーヘッドの話かと・・・ 違った? > 46んで 50 get...
>>50 そうなんだよ
結構遅いしメモリつーかスタック使うし・・・
#include <stdio.h> static char *_toHex(char *buf, unsigned int x){ if (15 < x) buf = _toHex(buf, x >> 4); x &= 15; *buf = (x<10 ? '0'+x : 'A'+x-10); return buf+1; } char *toHex1(char *buf, unsigned int x){ *_toHex(buf, x) = '\0'; return buf; } char *toHex2(unsigned int x){ static char buf[9]; return toHex1(buf, x); } unsigned int toInt(const char *buf){ unsigned int x = 0; for(; *buf; buf++) x = x*10 + *buf - '0'; return x; } int main(int argc, char *argv[]){ return 1<argc ? puts(toHex2(toInt(argv[1]))) : puts("give me a number."); } 一度整数型にしてるという卑怯さ加減の凄さはもはや芸術的(;´ー`) toHex2 はスレッドセーフですらないっ
>>52 mainが一番気に入った。他のコードはちょっと・・・
一番どうでもいいトコロが気に入られた(;´Д`)ウツダ
%X 使っちゃダメなの?
56 :
デフォルトの名無しさん :02/04/13 12:50
>>52 バッファは呼び出し元で確保させとけ、みたいな。
それだけでスレッドセーフって感じ?
57 :
デフォルトの名無しさん :02/04/13 13:06
void toHex(int s, char *d){ for(;s>0;s/=16)*d++=s%16+(s%16<10?48:55);*d='\0'; } 左右逆だしマイナス未対応だし。 誰かなんとかしる。
sscanf()じゃだめなの?
標準関数は使わないという方向で。
でも、
>>57 のいうマイナス対応や小数点付きや指数表現、
そしてオーバーフローなんかを考えたらsscanf()、sprintf()のほうが
トータルコストが低いと思われ。まず仕様を規定したら。
問題が何通りかに解釈できるけど
「10進数字を16進数字に変える」しか正しい問題は無いよな?
内部で10進で持ってるとか思ってそうな
>>1 だな。
なんつーか、たまにこういうコードを書いてると なんかほっとするというかさ。 クロスワードとかナンクロとか好きな奴の気持ちが 理解できる瞬間だったりするよな。
ADD命令とDAA(デシマルアジャスト)命令をうまく使うのだ。
書き捨てのコードならこんな感じ? 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);}
65 :
たった3ステップの技法 :02/04/15 08:21
1.まず、「10進数」と打つ。 2.「0」を消す。 3.代わりに「6」を挿入。以上。 ※全角の6なので注意されたい
げげ、
>>23 でガイシュツだった。逝ってきます。
67 :
デフォルトの名無しさん :02/04/15 11:38
unsigned int a; (32bitととりあえず規定) これを16進表記の文字列に変換したときに何桁になるかを あらかじめ知りたいときは どう計算すれば桁数出てくるのかな? 昔トリッキースレで最上位に立ってるビットの位置を調べるとかいう 技があった記憶があるけどそれの応用でいけるかな?
log(a)/log(16)だろ
対数使わずに手で計算 ってのを考えてみるよ。 整数だけで済ましたいっつーかさ。
あ! 10進と読み間違った
>>69 効率的にやるなら、整数でバイナリ検索が一番効率的だと思う
if (a>=(16<<4)) {
if (a>=(16<<6)) {
・・・みたいに8分割して
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;
これを 調整すればいいんでない?
というわけで、こういうのを考えてみた。 int log16(unsigned int a){ return a<0x10?1:a<0x100?2:a<0x1000?3:4; } 4桁分までしか書いてないけどこれを8桁分まで書けばいいか。
74 :
デフォルトの名無しさん :02/04/15 12:21
ポイントは 0 でも一桁つかう ってところか?
4ビットずつ右に落としていき、0になるまでの回数を数える。 0の場合のみ例外として、1桁プラス。
>>73 >>75 その場合8回の比較が必要になる バイナリ検索にすれば半分に減らせる
けど、予測分岐されるCPUなら
>>75 が正解かな
ごめん 線形検索なら平均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) ) )
一回目 16ビット落し 二回目 16±8 三回目 16±8±4 で比較3回か。
>>78 おれの勘違いかも知れんけど、そのコード変じゃない?
16進にしたときの桁数ってそれじゃ求まらんような。
シフト数が変じゃない?
81 :
デフォルトの名無しさん :02/04/15 13:00
そんなことよりちょっときいてくれよ >2はわかるとしても >3 日本デーも三国志...三国志が日本? ハア? >4 3つでーも四国....四国が3つ? 何が? >5 4人でーも後藤マキ..後藤マキが4人? 全然できてないじゃん >7 1本目と8本目の間を数え忘れてる
即答ミスしたお詫びに分岐無しバージョンで 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;
>>80 ガーン! 確かに間違い。 16<<n を 1<< (4*n) に置換して
>>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;
}
誰か検証してみて
こんなコードで一応 正しいかどうかは 検証してるよ 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;
86 :
デフォルトの名無しさん :02/04/15 17:32
printf("10進=%d 16進=%x\n",aa,aa);
乱数か…
スレの方向を見失いました。
#include "../Library/lib.c" int i = htoi("0xFF"); 俺の環境だけです、他人は知りません。
>>89 ちょっとまった。その程度ならstrtolを使えば済む話だよね。
91 :
デフォルトの名無しさん :02/04/16 21:44
>>18 右手親指を基点として、
折った指を1としたとき、
10進数で8を表現しようとすると
指が痛い。
0x14のほうがつらい。 つか、8は痛くないぞ、
93 :
デフォルトの名無しさん :02/04/16 21:56
94 :
デフォルトの名無しさん :02/04/17 09:50
>>91 ちょっとまった。普通は指を立てたほうが1じゃないのか?
人前で0x04やると殺されるけど。
96 :
デフォルトの名無しさん :02/04/18 22:49
ごめんなさいミスりました。 #include "../Library/lib.c" char s[256]; itob(1000,s,16); 俺の環境だけです、他人は知りません。
98 :
棄教者 ◆witdLTi2 :02/04/25 19:20
>>96 普通の人は指折り数えるけど二進法で数えることはしない。
したがって指の形が0x04になることもない。
普通は指折り数えないか?
ナゼか右手では出来ん。 左手だとやたら早く数えられる。 二進指折り31まで早数え大会を開催しませう。
101 :
デフォルトの名無しさん :02/04/26 00:37
漏れの熱い10進数を君の勇気で16進数に変えるんだ!!
質問の意味よくわかんない。 "0123456789abcde"[x]じゃだめ?
104 :
デフォルトの名無しさん :02/04/26 00:43
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 …
105 :
デフォルトの名無しさん :02/04/26 00:48
>>103 駄目かどうか聞く前に、まずは過去の書き込みと
自分のレスの内容を再度確認したほうが良いのでは?
107 :
デフォルトの名無しさん :02/04/26 01:56
108 :
デフォルトの名無しさん :02/04/26 02:30
4ビット1桁とする10進数の浮動小数のクラスを作り 普通のINTやFLORTにキャストしろってことかな?
109 :
デフォルトの名無しさん :02/04/26 09:45
エラーというか、'\0'になるのでは。
もういいやん… 終わりにしようや。このスレ。
112 :
デフォルトの名無しさん :02/04/26 12:51
>>108 いや、それやるなら内部ではふつーのfloatなりdoubleなりでいいだろ・・・
113 :
デフォルトの名無しさん :02/04/26 15:01
もう少し 仕様をハッキリしてくれよ
>>158 それと平均ではダメな理由も
ところで
>>121 が言ってるような 16bit の2ドット同時に処理する コード希望
ゴメン 俺が間違った。 115は俺ではない。とにかくスマン
118 :
デフォルトの名無しさん :02/04/29 04:50
CでBCDにナイスに変換する方法を教えて!
>>118 BCDっていうのは4bit単位に10進数で表現するコードの事?
例 数1234 を 0x1234 とする
なら もう判ると思うけど 数を10進表現して それを16進として読めばよい
>>119 ナイスかどうかは知らんけど、これでいいか ?
char s[64];
char *dummy;
sprintf(s, "0x%d", x);
x = strtol(s, &dummy, 16);
俺に聞かれても
>>120 パソコンならそれでいいと思う。
BCDとか言うのは組込屋さんの仕事だろうから色んな制限があるだろうし
>>118 こういう奴以外でって事?
void UInt2Bcd(char *b,int l,unsigned u)
{for(b+=l;l--;u/=10)*--b=(char)(u%10);}
やっぱ普通に処理するしかないのかなぁ 割算とか嫌だなぁ… 答えてくれた皆さんありがとう。