Видя поток, я хотел указать хороший (и, возможно, более понятный) способ установки, сброса и переключения состояния бита в случае двух целых чисел без знака, как в потоке.Этот код должен быть OT, потому что использует x, который должен быть unsigned int
(или int
), а не enum
.
Я написал строку кода в конце этого ответа.
Код получает в качестве входных данных несколько пар параметров.Каждая пара параметров представляет собой букву и цифру.Буква может быть:
- S для установки бита
- R для сброса бита
- T для переключения бита
Число должно быть битовым значением от 0 до 63. Макросы в коде отбрасывают каждое число больше 63, и ничего не изменяется в переменные.Отрицательные значения не были оценены, потому что мы предполагаем, что значение бита является значением без знака.
Например (если мы назовем программу bitman):
Выполнение: bitman S 0 S 1 T7 S 64 T 7 S 2 T 80 R 1 S 63 S 32 R 63 T 62
Результат будет:
S 0 00000000-00000001
S 1 00000000-00000003
T 7 00000000-00000083
S 64 00000000-00000083
T 7 00000000-00000003
S 2 00000000-00000007
T 80 00000000-00000007
R 1 00000000-00000005
S 63 80000000-00000005
S 32 80000001-00000005
R 63 00000001-00000005
T 62 40000001-00000005
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
static uint32_t err1 = 0;
static uint32_t err2 = 0;
#define SET_ERROR_BIT(x) (\
((unsigned)(x)>63)?err1=err1:((x)<32)?\
(err1 |= (1U<<(x))):\
(err2 |= (1U<<((x)-32)))\
)
#define RESET_ERROR_BIT(x) (\
((unsigned)(x)>63)?err1=err1:((x)<32)?\
(err1 &= ~(1U<<(x))):\
(err2 &= ~(1U<<((x)-32)))\
)
#define TOGGLE_ERROR_BIT(x) (\
((unsigned)(x)>63)?err1=err1:((x)<32)?\
(err1 ^= (1U<<(x))):\
(err2 ^= (1U<<((x)-32)))\
)
int main(int argc, char *argv[])
{
int i;
unsigned int x;
for(i=1;i<argc;i+=2) {
x=strtoul(argv[i+1],NULL,0);
switch (argv[i][0]) {
case 'S':
SET_ERROR_BIT(x);
break;
case 'T':
TOGGLE_ERROR_BIT(x);
break;
case 'R':
RESET_ERROR_BIT(x);
break;
default:
break;
}
printf("%c %2d %08X-%08X\n",argv[i][0], x, err2, err1);
}
return 0;
}
Макросы разбиты более чем на одну строку, но каждый из них представляет собой однострочный код.
Основной код не имеет контроля ошибок, поэтому, если параметры заданы неправильно, программа может иметь неопределенное поведение.