2016-03-15 59 views
-6

我正在看一个在C++中的婴儿步骤巨大的步骤算法的例子,我不知道C++,但我可以理解大部分的程序,但是有两行我只是不知道他们做什么,不能理解一些C++

int powmod (int a, int b, int m) { 
    int res = 1; 
    while (b > 0) 
     if (b & 1) { 
      res = (res * a) % m; 
      --b; 
     } 
     else { 
      a = (a * a) % m; 
      b >>= 1; 
     } 
    return res % m; 
} 

可有人请解释一下什么是第一if声明(b & 1)是检查,并在else声明b >>= 1为什么有两种'>'运营商,这是你多么检查更大的/在C等于++?谢谢

+1

'如果(b&1)'检查'b'是否为奇数(将其低位位置1)。 'b >> = 1'将'b'右移一位,并将结果赋给'b';它大致相当于'b = b/2;'另见http://en.cppreference.com/w/cpp/language/operator_arithmetic –

+1

“我不知道C++,但我可以理解大部分程序”。 C++语法有很多很好的参考。你应该打开一个。这不是一个真正的编程问题。 –

+0

具体来说,查找位操作。 “&”(按位和)和“>>”(右移和扩展“>> =')都属于该类别。 –

回答

1

这是:>> =是对b执行右移操作并将其重新分配给b的右移赋值操作符。 >> = 1基本上将b除以2.

它将所有位1移到右边。如果二进制b为00000010(十进制2),b >> = 1会使b = 00000001(十进制为1)。另一个eg2:00001110(14)会变成00000111(7)等等。但是,如果再次失败,并且您失去了精确度:00000111(7)变为00000011(3)。

0

这些是位运算符。 '&'符号表示AND,在这种情况下,它将检查'b'的二进制表示形式,其中1的二进制表示形式。'>> ='也是一个称为右移的按位运算符。