if-statement - 批处理文件:在变量中使用比较结果?
问题描述
这是示例:
set /a "number1=1"
set /a "number2=10"
if %number1% LSS %number2% (set /a "number1=%number1%+1")
echo result=%number1%
此代码显示:
result=2
是否可以在批处理文件中将if
语句更改为:
set /a "number1=%number1%+(%number1% LSS %number2%)"
?
此时更改的代码显示:
Unbalanced parenthesis.
result=1
解决方案
该set /A
命令不具有比较运算符。
但是,有一种方法可以比较两个数字并获取-1
第一个数字是否小于第二个数字的值。为此,我们需要知道逻辑右移运算符>>
实际上执行算术移位,这意味着代表符号的最高有效位的值向左移入,因此数字的当前符号为保持。
例如:
- 右移一位的数字
+10
(二进制表示)变为(二进制表示);00000000 00000000 00000000 00001010
+5
00000000 00000000 00000000 00000101
- 右移一位的数字
-10
(二进制表示)变为(二进制表示);11111111 11111111 11111111 11110110
-5
11111111 11111111 11111111 11111011
当我们向右移动 31 个(或更多)位位置时,结果是符号位的 32 倍(因为我们有 32 位有符号整数),这导致-1
负输入值和0
其他输入值的值。
当我们现在应用这种技术时,它会导致我们得到以下代码:
set /A "number1=%number1%-((%number1%-%number2%)>>31)"
您可以省略周围的%
- 符号,因为无论如何都会set /A
将任何不表示数字或运算符的字符串解释为变量名:
set /A "number1=number1-((number1-number2)>>31)"
这可以使用适当的赋值运算符进一步简化:
set /A "number1-=(number1-number2)>>31"
推荐阅读
- amazon-web-services - 如何在一个 jenkins 脚本中使用多个 terraform tf 文件?
- c# - C# 服务不打开脚本
- python-3.x - 名称“main_window”未定义
- javascript - 在使用 Google Proto Js 编译器对枚举进行样式设置时,我们有哪些选项/配置
- azure - 如何将 FORMAT '--(37)9' 从 Teradata 转换为 Azure Synapse?
- python-3.x - 使用 pywinauto 迭代子菜单项
- renovate - 如何仅使用 Renovate 为匹配的依赖项创建 PR
- postgresql - Google Data Studio:连接到多租户 postgres 数据库中的多个模式
- python - 阅读csv时熊猫强制dtype
- reactjs - URL 链接无法访问 React 项目中的仪表板