/* * Given a 64-bit signed number, count the number of bits that are set to 1. * Bonus: In addition to the obvious approach, continue exploring till you find other efficient approaches. * * Example Inputs: * 0 * -1 * 14 * Outputs (respectively): * 0 * 64 * 3 * * Solution Guidance: * Let k be the bit width (maximum number of bits) of the primitive. * Easy: O(k) time. * Moderate: O(number of bits whose value is 1) time. * Very Hard: O(log(k)) time */ #include <iostream> using namespace std; inline bool isSet(long long int n,int i) { long long int x = 1; x <<=i; if(x&n) return true; return false; } int countBitsEASY(long long int n) { int size = sizeof(n)*8; int count = 0; for(int i=0; i<size; i++) { if(isSet(n,i)) count++; } return count; } int countBitsMODERATE(long long int n) { int size = sizeof(n) * 8; int count = 0; if(n<0) { n &= n^(1LL<<size-1); count = 1; } for(; n > 0; count++) n &= n-1; return count; } //found it to be Hamming weight problem on wiki. int countBitsVERYHARD(long long int n) { long long int result = (n & 0x5555555555555555LL) + (n>>1 & 0x5555555555555555LL); result = (result & 0x3333333333333333LL) + ((result>>2) & (0x3333333333333333LL)); result = (result & 0x0f0f0f0f0f0f0f0fLL) + ((result>>4) & (0x0f0f0f0f0f0f0f0fLL)); result = (result & 0x00ff00ff00ff00ffLL) + ((result>>8) & (0x00ff00ff00ff00ffLL)); result = (result & 0x0000ffff0000ffffLL) + ((result>>16)& (0x0000ffff0000ffffLL)); result = (result & 0x00000000ffffffffLL) + ((result>>32)& (0x00000000ffffffffLL)); return result; } int main() { long long int n = 15; int testCases ; cin>>testCases; for(int i=0; i<testCases; i++) { cin>>n; cout<<"\nEASY : "<<countBitsEASY(n); cout<<"\nMODERATE : "<<countBitsMODERATE(n); cout<<"\nVERY HARDS : "<<countBitsVERYHARD(n)<<endl; } }
Monday, 2 September 2013
COUNT BITS
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment