Преобразование битового поля в int

При дальнейшей мысли, что-то вроде этого должно быть то, что вы хотите:

CREATE TEMPORARY TABLE DateSummary1 ( datenew timestamp ) SELECT DISTINCT(DATE(datecreated)) as datenew FROM users;

CREATE TEMPORARY TABLE DateSummary2 ( datenew timestamp, number int ) SELECT DATE(datecreated) as datenew, count(*) AS number FROM users 
WHERE DATE(datecreated) > '2009-06-21' AND DATE(datecreated) <= DATE(NOW())
GROUP BY DATE(datecreated) ORDER BY datecreated ASC;

SELECT ds1.datenew,ds2.number FROM DateSummary1 ds1 LEFT JOIN DateSummary2 ds2 on ds1.datenew=ds2.datenew;

Это дает вам все даты в первой таблице и сводные данные count во второй таблице. Возможно, вам придется заменить ds2.number на IF(ISNULL(ds2.number),0,ds2.number) или что-то подобное.

13
задан N 1.1 18 March 2010 в 09:40
поделиться

3 ответа

Вы можете использовать объединение:

typedef union bitsetConvertor {
    bitset bs;
    uint16_t i;
} bitsetConvertor;

bitsetConvertor convertor;
convertor.i = myInt;
bitset bs = convertor.bs;

Или вы можете использовать приведение:

bitset bs = *(bitset *)&myInt;

Или вы можете использовать анонимную структуру в объединении:

typedef union morder {
    struct {
        unsigned int targetRegister : 3;
        unsigned int targetMethodOfAddressing : 3;
        unsigned int originRegister : 3;
        unsigned int originMethodOfAddressing : 3;
        unsigned int oCode : 4;
    };

    uint16_t intRepresentation;
} bitset;

bitset bs;
bs.intRepresentation = myInt;
16
ответ дан 1 December 2019 в 06:53
поделиться

Пожалуйста, пожалуйста, не используйте союз. Или, скорее, поймите, что вы делаете, используя союз - желательно до того, как вы его используете.

Как вы можете видеть в этом ответе, не полагайтесь на битовые поля, чтобы быть переносимыми. Специально для вашего случая порядок битовых полей в структуре зависит от реализации.

Теперь, если ваш вопрос был, как вы можете распечатать структуру битового поля как int, для случайного частного обзора, конечно, союзы великолепны. Но вы, похоже, хотите получить «фактическое значение» ваших битовых полей.

Итак: если вы работаете только над этой комбинацией машина/компилятор, и вам не нужно полагаться на математическое значение int, если это имеет смысл, вы можете использовать союзы. Но если вы можете перенести свой код или если вам нужно «фактическое значение» int, вам нужно написать код для обработки битами, чтобы получить битовые поля в правильные биты int.

21
ответ дан 1 December 2019 в 06:53
поделиться

Конечно - просто используйте объединение. Затем вы можете получить доступ к своим данным либо как 16-битное int, либо как отдельные битовые поля, например.

#include <stdio.h>
#include <stdint.h>

typedef struct {
    unsigned int targetRegister : 3;
    unsigned int targetMethodOfAddressing : 3;
    unsigned int originRegister : 3;
    unsigned int originMethodOfAddressing : 3;
    unsigned int oCode : 4;
} bitset;

typedef union {
    bitset b;
    uint16_t i;
} u_bitset;

int main(void)
{
    u_bitset u = {{0}};

    u.b.originRegister = 1;
    printf("u.i = %#x\n", u.i); 

    return 0;
}
4
ответ дан 1 December 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: