首页 > 解决方案 > 移位后无法恢复正确的值

问题描述

我试图通过解决一些特定问题来围绕按位运算符。我得到的一个有趣的方法是首先将几个数字存储到一个变量中,然后将这些数字写回。存储的东西显然是由日期、月份和年份组成的日期。

我将变量声明为整数,因为 32 位是最小的变量大小,足以存储一个从 1 到 12 的值、一个从 1 到 31 的值以及一个从 1 到 9999 的值。

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

之后,我通过将相对于我正在输出的日期部分所需的时间量向右移动,然后将其与所需的数字相加,以翻转最左边的所有内容,从而将值输出到控制台部分为 0 并获得输入的日、月和年的值。

如果我的描述不是很清楚,我很抱歉,但是您希望通过查看随附的代码来了解我在说什么。我遇到的问题是日期和月份值显示正确,但我总是得到错误的年份,我根本不明白为什么。任何帮助深表感谢!

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))

标签: vb.netbit-manipulationbitwise-operatorsbit-shiftbitwise-and

解决方案


我相信你的问题在于你的最后一行。
你用产生所有's 二进制的值来掩盖你的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

我希望这有帮助!


推荐阅读