package cn.iocoder.yudao.framework.common.thealgorithms.bitmanipulation;
import java.util.Optional;

///**
// * Find Highest Set Bit
// * This class provides a function calculating the position (or index)
// * of the most significant bit being set to 1 in a given integer.
// * @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi)
// */
//
//public final class HighestSetBit {
//    private HighestSetBit() {
//    }
//
//    public static Optional<Integer> findHighestSetBit(int num) {
//        if (num < 0) {
//            throw new IllegalArgumentException("Input cannot be negative");
//        }
//
//        if (num == 0) {
//            return Optional.empty();
//        }
//
//        int position = 0;
//        while (num > 0) {
//            num >>= 1;
//            position++;
//        }
//
//        return Optional.of(position - 1);
//    }
//}


/**
 * 查找最高设置位
 * 这个类提供了一个函数，用于计算给定整数中被设置为 1 的最高有效位的位置（或索引）。
 * @作者 Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi)
 */

public final class HighestSetBit {
    private HighestSetBit() {
    }

    // 查找最高设置位的位置
    public static Optional<Integer> findHighestSetBit(int num) {
        // 输入不能为负
        if (num < 0) {
            throw new IllegalArgumentException("输入不能为负");
        }

        // 如果数字为 0，则返回空
        if (num == 0) {
            return Optional.empty();
        }

        // 初始化位置
        int position = 0;
        // 当数字大于 0 时，右移并增加位置
        while (num > 0) {
            num >>= 1;
            position++;
        }

        // 返回最高设置位的位置
        return Optional.of(position - 1);
    }
}
