トップページ⇒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;

これを 調整すればいいんでない?
■ このスレッドは過去ログ倉庫に格納されています