每日一题提取一个数最后侧的1

Posted 唐宋xy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题提取一个数最后侧的1相关的知识,希望对你有一定的参考价值。

题目

怎么把int类型的数,提取出最右侧的1来

例如: 12的二进制为: 1 1 0 0,最右侧的1是指:最终的结果为:0 1 0 0

解析

  • 这里的最右侧的1指的是二进制中的最右的1,涉及二进制操作,一般选择使用位运算使用
  • 算法思路:
    • 先对当前数取反(1变0,0变1)
    • 然后对取反之后的数加1(目的是为了将最右侧的1保留,最后可以得到)
    • 将原来的数对第二步得到的数做与运算(将其他的数去除,因为上一步加1了,所以最右侧的1可以得到)
// 举个栗子:
给定一个数i

 	    i:  0 1 1 0 1 1 1 0 0 0 0 1 0 0
	   ~i:  1 0 0 1 0 0 0 1 1 1 1 0 1 1     取反(10,01~i+1:  1 0 0 1 0 0 0 1 1 1 1 1 0 01进位
i&(~i+1) :  0 0 0 0 0 0 0 0 0 0 0 1 0 0     结果
  • 代码实现:
public static int rightOne(int i) 
    return i & (~i + 1);

以上是关于每日一题提取一个数最后侧的1的主要内容,如果未能解决你的问题,请参考以下文章

每日一题找到出现奇数次的两个数

每日一题找到出现奇数次的两个数

《LeetCode之每日一题》:239.最大连续 1 的个数

[ 9.28 ]CF每日一题系列—— 940A规律构造

每日一题_190922

每日一题2倍数的个数