Пример #1
0
TEST(BitopsTest, findFirst1) {
  std::bitset<64> bitset(1);
  for (int i = 0; i < 63; i++) {
    size_t out = findFirst1(bitset);
    EXPECT_EQ(i, out);
    out = findFirst1(bitset, i, bitset.size());
    EXPECT_EQ(i, out);
    out = findFirst1(bitset, i+1, bitset.size());
    EXPECT_EQ(bitset.size(), out);
    bitset <<= 1;
  }
}
Пример #2
0
TEST(BitopsTest, cornercase) {
  std::bitset<64> bitset;
  bitset.set(0);
  size_t out = findLast1(bitset, 0, 1);
  EXPECT_EQ(0, out);
  out = findFirst0(bitset, 0, 0);
  EXPECT_EQ(0, out);
  out = findFirst1(bitset, 1, 1);
  EXPECT_EQ(1, out);
  out = findLast0(bitset, 2, 2);
  EXPECT_EQ(2, out);
}
Пример #3
0
int squareMultiply(int number,int exp,int mod)
{
  int i,retval,first1;
  first1=findFirst1(exp);
  if(DEBUG)
    printf("Num=%d\tExp=%d\tMod=%d\tfirst1=%d\r\n",number,exp,mod,first1);
  retval=number;//the first bit
  for(i=first1-1;i>=0;i--)//the rest of the bits
    {
      retval = (int)pow(retval,2);//always square
      retval%=mod;
      if(DEBUG)
	printf("AfterSquare=%d\r\n",retval);
      if((exp&(1<<i)) > 0)//only multiply if the bit is a 1
	{
	  retval*=number;
	  retval%=mod;
	  if(DEBUG)
	    printf("AfterMultiply=%d\r\n",retval);
	}
    }
  return retval;
}