Как работают параметры битовых флагов метода (Ansi C/C)?
Я программирую POS (пункт продажи) на C (ANSI C)
У меня есть эта функция
GetString(uchar *str,uchar mode,uchar minlen,uchar maxlen)
Это что-то вроде readln
но в поз
В API mode
параметр что-то вроде D1,D2,D3...
Но в примере (API) у меня есть это
if(!GetString(buf, 0x26, 0, 10))
{
buf[buf[0]+1]=0; amt=atol(buf+1);
} else {
/* user press CANCEL button */ }
Так, каково отношение между 0x26 (параметр mode
в функции) и двоичные числа или битовый флаг или даже, я не знаю, шестнадцатеричный.
В API есть еще одна вещь, объясняющая mode
входной параметр
1. Input mode definition: (priority order is bit3>bit4>bit5, and mode&0x38≠0);
2. When inputting, the digit will be displayed on the screen in turns as plaintext or cryptograph (according to bit3).
3. The initial cursor position is determined by ScrGotoxy(x, y).
4. If bit7 of mode =1, then this function could bring initial digit string, and the string is displayed on initial cursor position as input digit string.
5. Output string does not record and contain function keys.
6. Press CLEAR button, if it is plaintext display, then CLEAR is considered as BACKSPACE key; if it is cryptograph display, then CLEAR is considered as the key to clear all contents.
7. Use function key to switch to Capital mode. S80 uses Alpha key to select the corresponding character on a key, however SP30 uses UP and Down key, and T52 uses ―#‖ key, T620 uses key F2.
8. In MT30, the switch method between uppercase, lowercase and number characters is to keep pressing
3 ответа
На странице, на которую вы ссылаетесь, указаны 8-битные флаги. В вашем примере у вас есть шестнадцатеричное значение 0x26
который является двоичным значением 00100110
, Это определяет 8 битовых флагов, из которых 3 (D1, D2, D5) установлены, а 5 (D0, D3, D4, D6, D7) сброшены.
Если вы ссылаетесь на связанную таблицу (это рисунок, поэтому я не могу его вставить), он говорит вам, как GetString
аргумент mode
инструктирует функцию вести себя для каждого из 8 битовых флагов set (1) или clear (0).
Например D2
значение 1 указывает на выравнивание по левому краю.
Объединение отдельных флагов дает двоичное число, которое в вашем примере передается как шестнадцатеричное число 0x26
,
D1, D2, D3 ... D7 являются битами. Я полагаю, это используется как битовый флаг. Поскольку это всего 1 байт, он имеет 8 возможных состояний, и все они могут быть объединены вместе.
0x26
десятичный 38
или двоичный
00100110
это означает, что D1, D2, D5 установлены, а все остальные D - нет.
Это поможет вам, я определил макрос для управления битом D7, который согласно документации является битом режима ENTER.
продолжайте таким же образом с другими режимами.
// bits manipulation
// idx stand for bit index
#define CHECK_BIT(var,idx) ((var >> idx) & 1)
#define SET_BIT(var,idx,n) (var ^= (-(n?1:0) ^ var) & (1 << idx))
// helping macros
// check if Enter mode is set D7 is used
#define IS_ENTER_MODE_SET(mode) CHECK_BIT(mode,7)
// set Enter mode to opt (true,false)
#define SET_ENTER_MODE (mode,opt) SET_BIT(mode,7,opt)