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; } }
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); }
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; }