无法理解C代码片段中(b& 1)的含义

时间:2018-05-24 20:05:20

标签: c

inline ll modinv(ll a , ll b)
{
    ll res=1;
    while (b)
    {
        if(b&1)
            res = (res*a)%mod;
        a=(a*a)%mod;
        b=b/2;
    }
    return res;
}

是否仅在b == 1时才满足条件。

3 个答案:

答案 0 :(得分:5)

It is a bitwise operation, checking if b is odd or even.

//table is a CloudTable object
List<string> propertiesToRetrieve = new List<string>() { "MyIntProperty"}
TableOperation op = TableOperation.Retrieve("partitionkey", "rowkey", propertiesToRetrieve);
TableResult result = table.Execute(op);
DynamicTableEntity myEntity = (DynamicTableEntity)result.Result;
DateTime ts = myEntity.Timestamp;
int? customIntProperty = myEntity.Properties["MyIntProperty"].Int32Value;

答案 1 :(得分:5)

在这种情况下,

&是一个按位运算符。当您执行b&1时,您会得到一个整数b,表示十进制数为13,数字为1

         d7 d6 d5 d4 d3 d2 d1 d0
b = 13 =  0  0  0  0  1  1  0  1 
     1 =  0  0  0  0  0  0  0  1
          -----------------------  after bitwise and operator
          0  0  0  0  0  0  0  1

b的每个位上方的逻辑&以及1的二进制表示的相应位。由于其中一个整数为1,其位置1只有一个d0,因此0中所有位置的所有按位和运算符都将计算为d7 } d1,因为结果中d0的结果取决于变量d0 b中的内容。

所有奇数在1位置的二进制表示中都有d0。所有偶数在0位置的二进制表示中都有d0

因此,这是一种检查d0处的数字的方法。如果是1b&1的结果将是1,否则它将是0,这将使我们能够确定整数是偶数还是奇数,在此情况下。

虽然按位运算符的类似应用程序可以检查整数的哪个位是10,但是在整数等中设置一个特定位。

修改

@chux做了一些相当不错的观点,看看答案。注意一个人的补充问题(但除非你使用一些奇怪的硬件,否则你可能永远不会遇到它)。此外,现在,检查奇数偶数模运算符会更好,因为好的编译器可以生成有效的代码。

答案 2 :(得分:3)

  

此代码段中的(b&1)是什么意思?(?)

它试图在类型ll上测试奇数 - 也许是long long。这是通过屏蔽( anding )最低有效位来完成的。

鉴于int可以使用One's complement),(并且这可能仅适用于计算机墓地中的计算机),b&1对于带有负值的奇数/偶数测试不起作用那些稀有的机器。

if(b%2)确实适用于那些和所有其他平台来测试奇数。

一个常见的问题是b%2将执行除法,而不是快速。对于弱编译器可能也是如此,但是现代编译可以使用if(b%2)发出有效的代码(使用指令)。

清晰的代码。

顺便说一句:inline ll modinv(ll a , ll b)是UB,或者当res*aa*a溢出@ supercat且病态情况为mod == 1时返回错误的值。