9. Keep Only the Highest Set Bit

Discussions7
Log in to post comments and replies.
viswa0894
viswa0894
Oct 20 2026edited
//proper bitwise solution
//reg & (reg-1) clears the lowest bit
uint16_t highest_set_bit(uint16_t reg) {
    while(reg & (reg-1)){
        reg -=1;
    }
    return reg;
}
+1
lokesh-singh373248

Good approach. I just did a little change so that only the righmost set bit is removed in the next iteration.

0
lokesh-singh373248
uint16_t highest_set_bit1(uint16_t reg) {

    if(reg == 0) return 0;
/*
    (reg & (reg - 1) clears the lowest (rightmost) set bit of reg.
    This expression is nonzero whenever reg contains more than one set bit.
*/
    while(reg & (reg - 1)){
        reg &= (reg - 1);
    }
    return reg;
}
0
KarthikVinti
KarthikVinti
Sep 03 2026

#include <stdio.h>

#include <stdint.h>

// Complete the function

uint16_t highest_set_bit(uint16_t reg) {

    // Your logic here

    int bit=0,temp,k=0;

    while(bit <= 31)

    {

        temp = reg & (1<<bit);

        if(k < temp)

        {

            k = temp;

        }

        bit++;

    }

    return k;

}

int main() {

    uint16_t reg;

    scanf("%hu", &reg);

    uint16_t result = highest_set_bit(reg);

    printf("%hu", result);

    return 0;

}
0
SIDDHARTHARAJ
SIDDHARTHARAJ
Nov 01 2026
// Unique Solution Among All
// function
uint16_t highest_set_bit(uint16_t reg) {
    uint16_t max = 0;

    for (int i = 15; i >= 0; i--) {
        uint16_t mask = 1 << i;
        if (reg & mask) {
            max = reg & mask;
            break;
        }
    }
    return max;
}
+1
RamYarramsetti
RamYarramsetti
Aug 17 2026

#include <stdio.h>

#include <stdint.h>


 

// Complete the function

uint16_t highest_set_bit(uint16_t reg) {

    // Your logic here

    if (reg ==0) {

        return 0;

    }

    for (int i =15; i>=0; i--){

        uint16_t mask = 1<<i;

        if(reg & mask) {

            return mask;

        }

    }

}


 

int main() {

    uint16_t reg;

    scanf("%hu", &reg);


 

    uint16_t result = highest_set_bit(reg);

    printf("%hu", result);

    return 0;

}

0
KangajanKuganathan
#include <stdio.h>
#include <stdint.h>

// Complete the function
uint16_t highest_set_bit(uint16_t reg) {
    // Your logic here
    if (reg == 0) return 0;

    // Step 1: Smear bits to the right
    reg |= (reg >> 1);
    reg |= (reg >> 2);
    reg |= (reg >> 4);
    reg |= (reg >> 8);

    // Step 2: Subtract the (reg >> 1) value form reg   
    return reg - (reg >> 1);
}

int main() {
    uint16_t reg;
    scanf("%hu", &reg);

    uint16_t result = highest_set_bit(reg);
    printf("%hu", result);
    return 0;
}
+2
ElliotWyrick
ElliotWyrick
Aug 16 2026

Oh man this is clever. Very efficient. 

0
NordinSutkovic
NordinSutkovic
Aug 18 2026

uint16_t highest_set_bit(uint16_t reg) {

    int i;

    int j = 0;

    for (i = 15; i >= 0; i--)

    {

        if( reg & (1<<i))

        {

            reg = 0;

            reg |= (1<<i);

            return reg;

        }


 

    }

    return reg;

}


 

+2
AmitabhPathak
AmitabhPathak
Jul 19 2026

where have you used j?

 

0
GauthamShankar
GauthamShankar
Oct 30 2026

    uint16_t highest_set_bit(uint16_t reg) {

        reg|=reg>>1;

        reg|=reg>>2;

        reg|=reg>>4;

        reg|=reg>>8;

        return reg&~(reg>>1);

    }

O(1) time complexity 

+9
quoctoanahihi123
quoctoanahihi123
Jul 19 2026

#include <stdio.h>

#include <stdint.h>

 

// Complete the function

uint16_t highest_set_bit(uint16_t reg) {

    // Your logic here

    for (int i = 15; i>=0 ; i--){

        if ( reg & (1<< i)){

            return reg &= (1<<i);

        }

    }

    return 0;

}

 

int main() {

    uint16_t reg;

    scanf("%hu", &reg);

    uint16_t result = highest_set_bit(reg);

    printf("%hu", result);

    return 0;

}

0