每日一题提取一个数最后侧的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 取反(1变0,0变1)
~i+1: 1 0 0 1 0 0 0 1 1 1 1 1 0 0 加1进位
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的主要内容,如果未能解决你的问题,请参考以下文章