例如,我想存储包含天,月,年的日期。
31
,月份 - > 12
,年 - > 99
。我想将31
,12
,99
存储在一个变量中,并使用移位运算符<<
和>>
来操纵它。
我尝试做的事情:
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
。
我不知道这个想法本身是否可行。
答案 0 :(得分:5)
您的意思是<<=
,而不是<<
。
那就是说,你的代码还有另外两个问题:
int16_t
或uint16_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