vb.net - 移位后无法恢复正确的值
问题描述
我试图通过解决一些特定问题来围绕按位运算符。我得到的一个有趣的方法是首先将几个数字存储到一个变量中,然后将这些数字写回。存储的东西显然是由日期、月份和年份组成的日期。
我将变量声明为整数,因为 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))
解决方案
我相信你的问题在于你的最后一行。
你用产生所有's 二进制的值来掩盖你的Day
和。
但是,您没有正确掩盖您的年份。Month
1
9,999 是10 0111 0000 1111
二进制的,这意味着您保证某些位在一起编辑0
时会保留AND
。
这将导致这一年产生有缺陷的结果。如果您正在寻找 14 位年份格式,则需要用 屏蔽2^14 - 1
,即16,383
,它是11 1111 1111 1111
二进制的。
请注意,31 和 15 遵循相同的原则:
15 = 1111
和31 = 11111
我希望这有帮助!
推荐阅读
- android - 如何将两个带有共享变量的 kotlin 数据对象合并为一个对象?
- r - 如何通过考虑多词在文本中的位置来挖掘多词?
- delphi - FireDac 查询返回空结果
- javascript - JS通过烧瓶{{变量}}格式访问python变量不起作用
- angular - 填充数据源时角度材料表不显示值
- vlang - 用点分隔的插值字符串解析错误?
- mysql - Docker:当 MySQL 准备好时,“wait-for-it”脚本不会启动应用程序
- php - 如何将json文件中的数据转换为php中的星期几?
- python - OpencCV HoughLines 找不到垂直线
- sql - 找出每个项目每个员工的总劳动力成本