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时才满足条件。
答案 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
处的数字的方法。如果是1
,b&1
的结果将是1
,否则它将是0
,这将使我们能够确定整数是偶数还是奇数,在此情况下。
虽然按位运算符的类似应用程序可以检查整数的哪个位是1
或0
,但是在整数等中设置一个特定位。
修改强>
@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*a
或a*a
溢出@ supercat且病态情况为mod == 1
时返回错误的值。