/* parity of the number of bits 0 if even; 1 if odd. for 32 bit words */ unsigned int Parity (unsigned int w) { w ^= w>>1; w ^= w>>2; w ^= w>>4; w ^= w>>8; w ^= w>>16; return w & 1; } BOOLEAN PowofTwo (unsigned int w) { unsigned wm = w-1; return (w ^ wm) >> 1 == wm; } /* swaps bits at position pos1, pos2 in w */ unsigned int Exchange (unsigned int w, unsigned int pos1, unsigned int pos2) { unsigned int m1 = 1 << pos1; unsigned int m2 = 1 << pos2; if (!(w & m1) != !(w & m2)) w ^= m1 | m2; return w; } unsigned int RightRotate (unsigned int w, unsigned int s) /* for 32 bits */ { s = s & 31; return (w << 32-s) | (w >> s); } unsigned int LeftRotate (unsigned int w, unsigned int s) { s = (32-s) & (31); return (w << 32-s) | (w >> s); } BOOLEAN Subset (unsigned int u, unsigned int v) { return (u & v) == u; }