0

この問題を解決するには、ビット演算とポインター演算しか使用できません。バイナリから unsigned int に変換しています。

私が書いている関数は次のとおりです。

unsigned int atob(const char* nptr);

atob("101") は 5 を返し、atob("11000") は 24 を返し、atob("11$") は 3 を返し、atop("") は 0 を返す必要があります。

私はビット単位の操作にかなり慣れていないので、その分野で特に助けが必要です。

編集:

nptr はインクリメントのみ可能で、他の inc/dec は許可されません。

4

3 に答える 3

2
unsigned bits2val(char *bits)
{
    unsigned val;

    for (val = 0; *bits; bits++) {
        if (*bits == '1') 
            val = (val << 1) | 1;
        else if (*bits == '0' ) 
            val <<= 1;
        else 
            break;
    }

    return val;
}
于 2012-07-03T15:27:11.123 に答える
1

シフトと or のみを使用した実装例を次に示します (++文字列操作に使用できると仮定します)。

unsigned atob(const char *input)
{
    unsigned result = 0;
    unsigned currentBit = 0;

    // we need to go right to left;
    const char *end = input;
    // make sure we only read '0's and '1's
    while ((*end == '0') || (*end == '1'))
    {
        end++;
    }

    while (--end >= input) {
        // check for overflow
        if ((currentBit >> 3) > sizeof(result))
            break;

        char isCurrentBitSet = *end == '1';
        unsigned setValue = (isCurrentBitSet << currentBit);
        result |= setValue;

        currentBit++;
    }

    return result;
}
于 2012-07-03T12:36:02.987 に答える
0

基本から始めましょうhttp://www.wikihow.com/Convert-from-Decimal-to-Binary

于 2012-07-03T12:23:07.390 に答える