$((M&; 0x10000000))的含义是什么?

时间:2019-04-01 08:17:42

标签: bash shell

我有这行:

if [ $((M &amp ;0x10000000)) -eq 0 ]; then  

但是我不知道这行是什么意思。 M是包含数字的变量。但是我不知道&amp ; 0x10000000会用数字做什么。

3 个答案:

答案 0 :(得分:1)

让我们逐步分析您的行,并在man bash中查看答案:

  • $(( expression ))

      

    算术扩展允许对算术表达式进行求值并替换结果。算术扩展的格式为$((expression))。将该表达式视为在双引号内,但括号内的双引号未得到特殊处理。表达式中的所有标记都经过参数扩展,字符串扩展,命令替换和引用删除。算术扩展可以嵌套。根据以下“算术评估”下列出的规则进行评估。如果expression无效,则bash会显示一条消息,指示失败,并且不会发生替换。

    这告诉我们M & 0x10000000将被算术评估。

  • M & 0x10000000

      

    在某些情况下,shell允许对算术表达式求值(请参见let并声明内置命令和Arithmetic Expansion)。评估是使用固定宽度的整数完成的,不检查溢出,尽管陷阱会被除以0并标记为错误。运算符及其优先级,关联性和值与C语言中的相同。以下运算符列表被分组为等优先级运算符。级别按降序排列。

         

    & 按位与

    这告诉我们,变量M将以十六进制值0x10000000进行bitwise AND运算。后者是268435456或2 ^ 28的十六进制表示形式。因此,从本质上讲,如果M & 0x10000000的第29位设置为0x10000000,则操作M将返回1,否则将返回0x0(请注意,它是一个比2 ^ 0 = 1多一点)。

  • [ EXPRESSION ] :执行二进制文件/bin/test并以EXPRESSION确定的状态退出。

      

    INTEGER1 -eq INTEGER2 INTEGER1等于INTEGER2

    这告诉我们,如果[ $((M & 0x10000000)) -eq 0 ]的结果等于0,则表达式true将返回M & 0x10000000,否则将返回false。

简而言之,

if [ $((M & 0x10000000)) -eq 0 ]; then

将对M进行测试,以检查M的第28位是否已设置。如果未设置,它将执行if语句中定义的操作。

本来应该是另一种表示法

if (( M & 0x10000000 == 0x0 )); then

答案 1 :(得分:0)

正在检查M中数字的第29位是否清除。

$ M=0xEFFFFFFF; [ $((M & 0x10000000)) -eq 0 ] && echo CLEAR || echo SET
CLEAR
$ M=0xFFFFFFFF; [ $((M & 0x10000000)) -eq 0 ] && echo CLEAR || echo SET
SET
$ M=0x10000000; [ $((M & 0x10000000)) -eq 0 ] && echo CLEAR || echo SET
SET
$ M=0; [ $((M & 0x10000000)) -eq 0 ] && echo CLEAR || echo SET
CLEAR

&是按位和运算符,它返回带有位集的数字,其中操作数具有相同的位集。参见https://en.wikipedia.org/wiki/Bitwise_operation

有关位掩码的更多信息:https://en.wikipedia.org/wiki/Mask_(computing)

答案 2 :(得分:0)

https://www.tldp.org/LDP/abs/html/dblparens.html

$((expression))将进行算术扩展。

if [ $((M & 0x10000000)) -eq 0 ]; then行将检查$M变量的第29位是否为零。如果是这种情况,它将执行then语句之后的内容。