Тема: Як отримати high-order bit і low-order bit з SHORT

high-order і low-order що це означає ? Як так розумію short в даному випадку використовується як два bool типа, тобто short має 2 байти, один байт це high-order і а другий low-order правильно я розумію ?
Як отримати доступ до high-order і low-order, наприклад мені потрібно порівняти чи high-order дорівнює 1 як це порівняння можна зробити ?

2

Re: Як отримати high-order bit і low-order bit з SHORT

Для початку - в C++ типи практично не мають однозначно визначених байтових відповідників, гарантоване лише співвідношення (short не довший за int). Тому уточнюйте - у вас 2-байтовий short.
Далі - у вас є 16-бітове число. Як порівняти частину його біт? Перше рішення - за аналогією з 10-ковою систомю: якщо у вас є двозначне число, то як порівняти його першу цифру з чимось? Правильно - поділити націло. Але для двійкових є ще й побітові операції, тут буде зручніше користуватися саме ними - загнати 1 в потрібний розряд і порівняти побітовим AND-ом:

if( x & 0x0100 != 0 )...

Якщо хочеться підкреслити кількість розрядів, то

if( x & (1 << 8 ) != 0 )...

Порівняння з нулем в обох випадках можна пропустити, залежно від задачі.

Подякували: Betterthanyou2

3 Востаннє редагувалося ReAl (29.04.2016 12:42:59)

Re: Як отримати high-order bit і low-order bit з SHORT

У Вас в темі bit, а в тексті byte, через це можуть бути розбіжності.

koala показав, як виділити молодші біти молодшого та старшого байту.
Якщо в unsigned short пакували саме bool, то там по стандарту саме 0 та 1 лише і можуть бути, але якщо пакували байти, які «будемо розглядати як bool», то такої гарантії нема.

байти (8-бітові порції) виділяти так:

unsigned char lo_byte = x & 0xFF;
unsigned char hi_byte = (x >> 8) & 0xFF;

А саме high order bit з unsigned short більш-менш «портабельно» можна виділити так:

#include <limits.h>
// USHRT_MAX має всі одинички на кількість бітів unsigned short
#define USHORT_HI_BIT_MASK ((unsigned short) ~(USHRT_MAX >> 1))

// або так, через бітову довжину
#define USHORT_HI_BIT_MASK (1U << (sizeof(unsigned short)*CHAR_BITS - 1))

Взагалі коли починає хотітися в С наворотити щось залежне від реальних розмірів змінних (я не маю на увазі роботу з апаратурою та stdint.h), то у переважній більшості випадків краще подумати і не робити такого (от навіщо пакувати два bool у short?).

Подякували: Betterthanyou, 0xDADA11C73

4

Re: Як отримати high-order bit і low-order bit з SHORT

ReAl написав:

(от навіщо пакувати два bool у short?).

То не я, таке робить функція GetKeyState

Return value

Type: SHORT
The return value specifies the status of the specified virtual key, as follows:
If the high-order bit is 1, the key is down; otherwise, it is up.
If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.

5 Востаннє редагувалося ReAl (29.04.2016 14:01:30)

Re: Як отримати high-order bit і low-order bit з SHORT

Betterthanyou написав:

То не я, таке робить функція GetKeyState

Ну з чужим як не крути, а розгрібатися.
Але і питання було не до Вас як претензія (з самого запитання зрозуміло, що то іззовні такий формат), а до Всесвіту — «за що нам така кара?».

Звертаю увагу, що там таки bit і треба брати старший біт, а не молодший біт старшого байту.

Хто їм заважав зробити (навіть нічого не міняти в API, просто додати у заголовки бітові маски і не змушувати людей думати, де той high-order bit на даній конкретній платформі).

#define VK_STATE_DOWN    0x8000
#define VK_STATE_TOGGLED 0x0001

// і далі
SHORT lshift_state = GetKeyState(VK_LSHIFT);
if (lshift_state & VK_STATE_DOWN) {
    // ...
}
Подякували: Betterthanyou1

6

Re: Як отримати high-order bit і low-order bit з SHORT

Оскільки SHORT це визначений windows api тип, я б не ліз у limits.h, а сперся б на обіцянку 16-бітності і зробив би для себе оці

#define VK_STATE_DOWN    0x8000
#define VK_STATE_TOGGLED 0x0001