Возможный дубликат:
Изменить бит шестнадцатеричного числа с ведущими нулями в C ++, (C)
У меня есть этот номер в шестнадцатеричной строке:
002A05(7th bit is set to 0)
Мне нужно инвертировать 7-й бит этого числа, поэтому после преобразования я получу
022A05
Но в случае
ABCDEF(7th bit is set to 1)
мне нужно получить
A9CDEF
Но он должен работать с шестнадцатеричным числом каждые 6 символов.
Это должно быть 7-й бит слева. Я пытаюсь конвертировать OUI в модифицированный EUI64
Я попытался преобразовать шестнадцатеричную строку в целое число через strtol, но эта функция убирает начальные нули.
Пожалуйста, помогите мне, как я могу решить это.
#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, но эта функция убирает начальные нули.
strtol
функция преобразует его в число. Ничего не значит, что он удаляет начальные нули, потому что числа не имеют начальных нулей — «6» и «06» — это два разных способа записи одного и того же числа. Если вы хотите, чтобы начальные нули при печати, вы можете добавить их тогда.
Самый простой способ, но не обязательно самый чистый;
Поскольку затрагивается только один символ, вы можете просто сделать это, используя простую манипуляцию со строками; при условии, что ваш ввод в верхнем регистре в строке input
;
input[1] = "23016745AB*******89EFCD"[input[1]-48];
num ^ 0x020000
^
является побитовым оператором xor.
Дано целое число x
число с инвертированным 3-м битом x ^ 2
,
Остальная часть ответа была дана вам ранее.
Примечание: в вопросе биты отсчитываются от старшего к младшему, начиная с 1. Затем 7-й бит шестнадцатеричного шестизначного числа является 3-м битом его 2-го старшего символа. Обычно биты считаются от младшего к старшему, начиная с 0, хотя.