/* * Generate mask indicating leftmost 1 in x. Assume w=32. * For example, 0xFF00 -> 0x8000, and 0x6600 --> 0x4000. * If x = 0, then return 0. */intleftmost_one(unsigned x);
Your code should contain a total of at most 15 arithmetic, bitwise, and logical operations.
Hint: First transform x into a bit vector of the form [0...011...1].
Code:
#include<stdio.h>#include<assert.h>intleftmost_one(unsigned x) { /* First, generate mask that all bits after the leftmost 1 are 1. */ x |= x >>16; x |= x >>8; x |= x >>4; x |= x >>2; x |= x >>1; /* Next, return the result. x && 1 deals with x = 0. * (x>>1)+1 turns all the bits but leftmost to 0. */return (x >>1) + ( x &&1);}intmain() {assert(leftmost_one(0xff00)==0x8000);assert(leftmost_one(0x6600)==0x4000);return0;}