-5

重複の可能性:
C++ で先行ゼロを使用して 16 進数のビットを変更する (C)

私はこの番号を16進文字列で持っています:

002A05(7th bit is set to 0)

この数値の 7 番目のビットを反転する必要があるため、変換後は次のようになります。

022A05

しかし、万が一

ABCDEF(7th bit is set to 1)

私は得る必要があります

A9CDEF

ただし、6文字の16進数ごとに機能する必要があります。

左から7番目のビットである必要があります。OUIを変更されたEUI64に変換しようとしています

strtol を介して 16 進文字列を整数に変換しようとしましたが、その関数は先頭のゼロを取り除きます。

どうすれば解決できるか教えてください。

4

4 に答える 4

2

最も単純な方法ですが、必ずしも最もクリーンであるとは限りません。

影響を受けるのは 1 つの文字のみであるため、単純な文字列操作を使用して行うことができます。入力が文字列で大文字であると仮定しますinput

input[1] = "23016745AB*******89EFCD"[input[1]-48];
于 2012-11-19T12:32:41.100 に答える
0
#include <stdio.h>

void flipme(char *buf, const char *inBuf)
{
    int x;
    sscanf(inBuf, "%x", &x);
    x ^= 1 << 17;
    sprintf(buf, "%06X", x);
}

int main(void)
{
    char buf[16];

    flipme(buf, "002A05");
    printf("002A05->%s\n", buf);

    flipme(buf, "ABCDEF");
    printf("ABCDEF->%s\n", buf);
}

出力:

002A05-> 022A05
ABCDEF-> A9CDEF

あなたが書いた:

strtolを使用して16進文字列を整数に変換しようとしましたが、その関数は先行ゼロを削除します。

関数はそれを数値strtolに変換します。数値には先行ゼロがないため、先行ゼロを削除すると言っても意味がありません。「6」と「06」は、同じ数値を書き込む2つの異なる方法です。印刷時に先行ゼロが必要な場合は、それらを追加できます。

于 2012-11-19T12:16:16.300 に答える
0
num ^ 0x020000

^ビットごとの xor 演算子です。

于 2012-11-19T12:18:19.500 に答える
0

与えられた整数xの 3 番目のビットを反転した数は ですx ^ 2。残りの答えは以前にあなたに与えられました。

注: 問題では、ビットは 1 から始まり、最高から最低まで数えられます。次に、6 桁の 16 進数の 7 番目のビットは、2 番目に高い文字の 3 番目のビットです。通常、ビットは 0 から始まり、最低から最高までカウントされます。

于 2012-11-19T12:18:37.590 に答える