gccの拡張使っていいなら
int fill(int n) {
return n ? (~0u >> __builtin_clz(n)) : 0;
}