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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
誰か変換の方法教えて下さい。
00022NGNG
1本デーもにんじん
00033NGNG
日本デーも三国志
00043NGNG
3つでーも四国
00055NGNG
4人でーも後藤マキ
00066NGNG
5歳で〜もろくでなしブルース
00077NGNG
7またでもヤマタノオロチ
0008八NGNG
八兵衛でも食いだおれ
00099NGNG
クソスレ
001010NGNG
倒産
0011BNGNG
佐藤B作
0012CNGNG
CCサクラ
0013DNGNG
decimal

ほら、これが10進数を16進数に変える方法だね。
0014ENGNG
calc.exe
0015FNGNG
FAQ読め
0016sageNGNG
ある人によると"人間の両手の指の数が10本だから10進数"らしいから、指の数が16本の人間を増やせば16進数に変換できるよ
0017デフォルトの名無しさんNGNG
Windowsの電卓で変換すれば?
0018&H12NGNG
人間の指は10本あるから1023まで余裕で数えられるよ
0019デフォルトの名無しさん NGNG
HEX(Num)
sprintf(str,"%X",num);

go to google;
0020デフォルトの名無しさんNGNG
人間の指は20本です
>>18は妖怪人間ベム
0021デフォルトの名無しさんNGNG
>>1

たとえば、「A6B」。

B = 11
6 = 6 * 16 = 96
A = 10 * 16 * 16 = 2560

11 + 96 + 2560 = 2667。電卓で確認してみて。

つまり・・・。 (換算して出た数(A=10,B=11…) * (16の(ビット目)乗)) + … をビット数分繰り返す。

……電卓使ったほうがはるかに簡単。

マジレスすまん。
0022デフォルトの名無しさんNGNG
>>21

おーい、10進数を16進数に変える方法を聞いているんだぞ。それだと逆だろう。
0023デフォルトの名無しさんNGNG
#include <stdio.h>
main()
{
char str[] = "10進数";
puts(str);
str[1] = '6';
puts(str);
}
0024デフォルトの名無しさんNGNG
>>23
16進数は全角ですよ。
0025デフォルトの名無しさんNGNG
>>24
ほんとだ。よく見てんな。
しかしなにゆえに全角になってんだ?
0026デフォルトの名無しさんNGNG
10進も16進もおんなじだ。表記法の違いであって数としてはかわらん。
0027デフォルトの名無しさんNGNG
>>26

>>1はプログラム内でのこととは一言も言っていませんよ?
0028デフォルトの名無しさんNGNG
プログラム外でのこととも一言も言っていませんよ?
0029デフォルトの名無しさんNGNG
マターリヽ(´ー`)ノシヨウヨ
0030デフォルトの名無しさんNGNG
マジレスすると、

# ruby -e 'puts "%x" % 10'
a
0031名無しNGNG
変換したい10進数を商が0になるまで16で割りつづける。
商を求める際には余りを記録しておく。
商が0になったら、余りを後ろから順に並べる。それが答え。

例えば10進数300を16進数に変えるなら

300 / 16 = 18 余り 12(C)
18 / 16 = 1 余り 2
1 / 16 = 0 余り 1

で、下から順に余りを並べたのが答え。
つまり16進数12Cが10進数300になる。
0032デフォルトの名無しさんNGNG
a = 300;
while (a) {
 b = a % 16;
 a /= 16;
 *buf-- = b + b>9?('a'-10):'0';
}
0033デフォルトの名無しさんNGNG
>>32
このコードって動いてる?
0034デフォルトの名無しさんNGNG
sprintf( buf, "0x%08x", number );
0035cout << hex << atoi(decimal) << endl;NGNG
>>32
不吉なコード

かならずよくないことがおこる
0036デフォルトの名無しさんNGNG
>>32
× *buf-- = b + b>9?('a'-10):'0';
○ *buf-- = b + (b>9?('a'-10):'0');

bufは、適当なchar配列の後方にポイントしておく(NULのひとつ手前に)
0037デフォルトの名無しさんNGNG
十進数の頭に0xをつければ16真数になるYO!
中学校の数学なら<sub>(16)</sub>って感じだNE!
0038デフォルトの名無しさんNGNG
マッチをデジタル時計のように並べて10を作りました。
マッチを1本だけ動かして16にしなさい。
0039デフォルトの名無しさんNGNG
>>38
処理系はなんですか?
0040hageNGNG

                  _
 | | ̄| \\  | |_
 | |_| //  | |_|
0041デフォルトの名無しさんNGNG
てっきり、
            
 |  _  \\     |_
 | |_|  //  | |_|

だとばっかり‥‥
0042デフォルトの名無しさんNGNG
A=任意の数字として

?HEX$(A)

だろ? 桁幅調整したいなら

?RIGHT$("000"+HEX$(A),4)

でもいいと思うよ。
0043ひろゆ子@暫定管&rlo;&lre;直人NGNG
̳A;
0044ひろゆ子@暫定管&rlo;&lre;直人NGNG
̳A;
0045ひろゆ子@暫定管&rlo;&lre;直人& ◆ekkdFK/o NGNG
test
0046デフォルトの名無しさんNGNG
sprintf(buf,"%x",number);
ってついついやっちゃうけど、これってコスト高いんだよね
0047デフォルトの名無しさんNGNG
まず反乱を起こし、独立国家を建てる。
  ↓
諸外国に戦争ふっかけて勝利する。
  ↓
16進数の使用を奨励する。
  ↓
頃合を見て、憲法で10進数使用を禁止する。

ま、がんばってくれ >1
0048デフォルトの名無しさんNGNG
つまりあれだ、結局だ〜れも知らない、と・・・・・・
0049デフォルトの名無しさんNGNG
>>46 べつに? 確保すべきbufのサイズも決まってるし 
0050通りすがり・・・NGNG
>>49
オーバーヘッドの話かと・・・ 違った? > 46んで 50 get...
0051デフォルトの名無しさんNGNG
>>50
そうなんだよ
結構遅いしメモリつーかスタック使うし・・・
0052デフォルトの名無しさんNGNG
#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 はスレッドセーフですらないっ
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
■ このスレッドは過去ログ倉庫に格納されています