是否可以在3个字节变量中插入三个数字?

时间:2015-06-29 22:36:05

标签: c++ bit-shift

例如,我想存储包含天,月,年的日期。

  • 天 - > 31,月份 - > 12,年 - > 99

我想将311299存储在一个变量中,并使用移位运算符<<>>来操纵它。

我尝试做的事情:

short date = 0;
date = 31; // day
date << 5;
date = 12; // month
date << 7;
date = 99; // year
printf("date: %d\n", date >> 15); // print the first value

但结果是0。 我不知道这个想法本身是否可行。

3 个答案:

答案 0 :(得分:5)

您的意思是<<=,而不是<<

那就是说,你的代码还有另外两个问题:

  • 您想要一个无符号变量;移位时,签名整数具有令人惊讶的行为。 (至少,如果你认为整数是一个比特序列,它们会这样做)
  • 如果您想要16位类型,则应使用int16_tuint16_t,而不是希望short的大小合适。

你想要这样的东西

static inline uint16_t pack_date(unsigned day, unsigned month, unsigned year)
{
    // Consider inserting some checking here to make sure the numbers
    // are in their expected ranges

    return (day << 11) | (month << 7) | year;
}

static inline uint16_t get_day(uint16_t packed_value)
{
    return packed_value >> 11;
}

static inline uint16_t get_month(uint16_t packed_value)
{
    return (packed_value >> 7) & 0xf;
}

static inline uint16_t get_year(uint16_t packed_value)
{
    return packed_value & 0x7f;
}

答案 1 :(得分:5)

是的,可以这样做。我会使用适当的$.ajax({ url: "https://community-open-weather-map.p.mashape.com/weather", type: "POST", data: { "lang": "en", "lat": "41.8369", "lon": "-87.6847", "units": "metric", }, headers: { "X-Mashape-Authorization": "", }, contentType: "application/json" }) .done(function(data, textStatus, jqXHR) { console.log("HTTP Request Succeeded: " + jqXHR.status); console.log(data); }) .fail(function(jqXHR, textStatus, errorThrown) { console.log("HTTP Request Failed"); }) .always(function() { /* ... */ }); 来掩盖值区域:

union

这使您的年份范围从0到127.您的决定,如果这足以满足您的实际使用情况。

答案 2 :(得分:1)

一种可能的方法,只需对代码进行最少的修改,

#include<stdio.h>
#include<stdint.h>
int main()
{
uint16_t date = 0;

date |= 31; // day
date <<= 4;
date |= 12; // month
date <<= 7;
date |= 99; // year

printf("day: %d\n", date>>11); // print the first value(day)
printf("month:%d\n",(date>>7)&0xF);
printf("year:%d\n",date&0x7F);
}

date的{​​{1}}值的日志输出:

printf("date value:%04x\n",date);

但正如其他人所说,使用Bit Field with Struct更好,比如

date value:0000
date value:001f
date value:01f0
date value:01fc
date value:fe00
date value:fe63
day: 31
month:12
year:99
date value:fe63