shell 算术展开、按位运算


shell 通过对一个算术表达式求值并替换结果来执行算术扩展。表达式可以像在双引号中一样来进行处理,并且可以嵌套。
求值算术表达式有以下两种格式:

# $[ expression ]
# $(( expression ))

应用举例

在某些场景特别方便,可以免去写程序的烦琐,如验证某些运算。
下面是验证《深入理解计算系统》练习题2.12的场景


表达式 ~0 将生成一个全1的掩码,不管机器的字大小是多少,可移植。
$ printf "%x\n" $(( ~0 ))
ffffffffffffffff
$ printf "%#x\n" $(( ~0 ))
0xffffffffffffffff

上面的测试显示,shell中,0按位取反后的值是64位的。
shell的printf命令前导字符打印:《shell脚本学习指南》表7-4:printf的标志中描述了格式参数中"#“号的意义,”#“可以用以输出前导"0x”(16进制)、“0”(8进制).


x & 0xFF 生成一个由x的最低有效字节组成的值

$ printf "%#x\n" $(( 0x89ABCDEF & 0xFF ))
0xef
$ printf "%#.8x\n" $(( 0x89ABCDEF & 0xFF ))
0x000000ef

验证

以下x = 0x87654321
A.x的最低有效字节,其他位均置为0

$ printf "%#.8x\n" $(( 0x87654321 & 0xFF ))       
0x00000021

B.除了x的最低有效字节外,其他的位置都取补,最低有效字节保持不变。

$ printf "%#x" $(( 0x87654321 ^ ~0xff))
0xffffffff789abc21

上面因为~0xff会生成64位的掩码,所以结果有些不符合预期,但后32位是符合预期的。


C.x的最低有效字节设置成全1,其他字节都保持不变。

$ printf "%#x" $(( 0x87654321 | 0xff ))
0x876543ff
root@petalinux:~# printf "%#x\n" $(( (( 0x1 << 31)-1) ))
0x7fffffff
root@petalinux:~# hex=0x8AABCDEF
root@petalinux:~# 
root@petalinux:~# printf "%#x\n" $(( hex & (( 0x1 << 31)-1) ))
0xaabcdef
root@petalinux:~#

转载地址:https://blog.51cto.com/dikeen/1242081

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值