如何删除字符?

时间:2009-12-02 22:17:55

标签: c++ hex

我开始(真正开始)一个装配工具,当时它只将十进制转换为十六进制,但我想从结果中删除零。这是代码:

// HexConvert.cpp
#include <iostream>
using namespace std;

int main()
{
    int decNumber;
    while (true)
    {
       cout << "Enter the decimal number: ";
       cin >> decNumber;
       // Print hexadecimal with leading zeros
       cout << "Hexadecimal: ";
       for (int i = 2*sizeof(int) - 1; i >= 0; i--)
       {
          cout << "0123456789ABCDEF"[((decNumber >> i*4) & 0xF)];
       }
       cout << endl;
    }
  return 0;
}

我该怎么做?

3 个答案:

答案 0 :(得分:2)

你的for循环应该有两种状态:

  1. 忽略'0'的起始状态 字符,但切换到下一个 非'''上的州
  2. 将每个角色打印到最后。
  3. 因此,第一个州需要在打印前检查每个字符。

答案 1 :(得分:2)

怎么样:

int number = 56;
cout << hex << number;

你也可以通过stringstream来获取十六进制字符串表示,其中包含:

#include <iostream>
#include <sstream>

int main () {
    int number = 45;
    std::ostringstream os;
    os << std::hex << number;
    std::cout << os.str() << std::endl;
}

有关stringstreams和fromString / toString的更多信息:http://cplusplus.co.il/2009/08/16/implementing-tostring-and-fromstring-using-stdstringstream/

答案 2 :(得分:1)

您可以直接从C ++调用此函数,但您可能需要保存一些寄存器,这取决于编译器。尽情转换到C ++。

        ;number to convert in [esp+4]
        ;pointer to string in [esp+8]

itoh:   mov edi, [esp+8]   ;pointer to c string
        bsr ecx, eax       ;calculate highest set bit
        and cl, $fc        ;round down to nearest multiple of 4
loop:   mov eax, [esp+4]
        shr eax, cl        ;mov hex digit to lowest 4 bit
        and eax, $f        ;mask hex digit
        cmp eax, 10        ;test if digit is in A..F
        jlt numdgt
        add eax, 'A'-'0'-10 ;it is
numdgt: add eax, '0'       ;ascii converted digit
        mov [edi], al      ;store to string
        inc edi            ;and increment pointer
        sub cl,4           ;decrement loop counter
        jnc loop
        mov byte[edi], 0   ;terminate string
        ret