移位后无法返回正确的值

时间:2018-11-16 22:39:59

标签: vb.net bit-manipulation bitwise-operators bit-shift bitwise-and

我试图通过解决一些特定问题来围绕位运算符。我得到的一个有趣的事情是,首先将多个数字存储到单个变量中,然后将这些数字写回。所存储的东西是一个日期,显然包括天数,月数和年数。

我将变量声明为Integer,因为32位是最小的变量大小,足以使足够的位存储1到12之间的一个值,从1到31之间的一个值和1到9999之间的一个值。

接下来,我从控制台获取Integer变量的“ day”部分的输入,并将其分配给所述变量。之后,我将位向左移动4个位,在右侧留下4个空闲位来存储“月”部分。然后,我从控制台获取月份值的输入,并将变量(console_input或OR)的值分配给我的变量。之后,我将所有14位右移,以允许该年份的值从1到9999,然后执行另一次“或”运算以将该值分配给该移位释放的14位。

此后,通过将相对于我要输出的日期的部分向右移所需的时间,然后将其与所需的数字相乘,以将数值向左移动,从而将值输出到控制台零件的零位,并获得输入的日,月和年的值。

很抱歉,我的描述不够清楚,但是希望您能通过查看所附的代码来理解我的意思。我遇到的问题是正确显示了日和月值,但是我总是回想错年份,而我根本不明白为什么。任何帮助深表感谢!

Dim inputDate As Integer
    Console.WriteLine("Day: ")
    inputDate = Console.ReadLine()

    inputDate = (inputDate << 4)

    Console.WriteLine("Month: ")
    inputDate = (inputDate Or Console.ReadLine())

    inputDate = (inputDate << 14)

    Console.WriteLine("Year: ")
    inputDate = (inputDate Or Console.ReadLine())

    Console.WriteLine("Day: {0}. Month: {1}. Year: {2}", ((inputDate >> 18) And 31), ((inputDate >> 14) And 15), (inputDate And 9999))

1 个答案:

答案 0 :(得分:1)

我相信您的问题就在您的最后一行。
您正在用产生所有Day的二进制值的值屏蔽Month1
但是,您没有正确地掩盖自己的一年。

9,999是二进制形式的10 0111 0000 1111,这意味着您保证0在一起时某些位将保留AND
这将导致这一年产生错误的结果。如果要查找14位年份格式,则需要用2^14 - 1(即16,383,即二进制11 1111 1111 1111)进行屏蔽。

请注意,31和15遵循相同的原则:
15 = 111131 = 11111

我希望这会有所帮助!