我写了一个程序来解决下面的练习。我得到了正确的时间和分钟,但我无法得到正确的秒数。
为了节省磁盘空间,目录条目中的时间字段为2 字节长。分配不同的比特,占几小时, 分钟和秒钟如下:
15 14 13 12 11|10 9 8 7 6 5| 4 3 2 1 0 H H H H H| M M M M M M| S S S S S
编写一个C ++程序,输入两个字节的时间输入和输入 使用合适的方法适当地分离小时,分钟和秒 按位运算符。
#include<iostream>
using namespace std;
int main()
{
unsigned int hours, mins, secs;
unsigned int time;
cout << "enter time ";
cin >> time;
hours = (time >> 11);
mins = ((time << 5) >> 10);
secs = ((time << 11) >> 11);
cout << hours << " " << mins << " " << secs << endl;
return 0;
}
为了获得分钟,我将输入向左移动5个位置,希望消除所有H
位,然后向右移动10个位置以消除所有S
位并且在最右边的位置有M
位。
同样的秒数。
但是,如果我输入445
,我希望结果为13分29秒,但程序会输出0 13 445
。
为什么小时和分钟似乎正确,但不是秒?
答案 0 :(得分:1)
您假设unsigned int的大小是16位,但它通常在现在的机器上实现为32位整数。
如果你将uint16_t用于变量时间,它应该可以工作。
使用uint16_t包括标题stdint.h。
#include <iostream>
#include <stdint.h>
using namespace std;
int main()
{
uint16_t hours, mins, secs;
uint16_t time = 445;
hours = (time >> 11);
mins = ((time << 5) >> 10);
secs = (time << 11);
secs >>= 11;
cout << hours << " " << mins << " " << secs << endl;
return 0;
}
(在QT 5.5上测试)
答案 1 :(得分:1)
secs = time & 0x1F; // This should give the 5 bits you're expecting for seconds.
答案 2 :(得分:0)
您应该将与您正在查看的部分时间段不对应的位归零。我将使用二进制文字(在C ++ 14中可用),但注释等效的十六进制文字。
struct time {
time(unsigned = 0); // also default constructs
unsigned hours;
unsigned mins;
unsigned secs;
}
time::time(unsigned packed) :
hours((packed & 0b1111100000000000) >> 11), // 0xF800
mins ((packed & 0b0000011111100000) >> 5 ), // 0x07E0
secs ((packed & 0b0000000000011111) ) // 0x001F
{ }
#include<iostream>
std::ostream& operator<< (std::ostream& os, time t) {
return os << t.hours << " " << t.mins << " " << t.secs;
}
int main()
{
time t(445);
std::cout << t << std::endl;
return 0;
}
答案 3 :(得分:0)
给出的任务是不可能的,因为分钟和秒都需要6位。您已为秒分配了5位。
2^5=32
2^6=64
使用此方案,需要17位来表示时间。