从二进制编码中提取小时,分钟和秒

时间:2018-02-19 15:08:03

标签: c++ bit-manipulation bit masking

我写了一个程序来解决下面的练习。我得到了正确的时间和分钟,但我无法得到正确的秒数。

  

为了节省磁盘空间,目录条目中的时间字段为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

为什么小时和分钟似乎正确,但不是秒?

4 个答案:

答案 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位来表示时间。