-
M=10011(19)
-
i=2,j=6,输出10001001100
-
思路如下:
-
1.将N中的从j到i之间清零
-
2.对M执行移位操作与j和i之间的位对其
-
3.合并M和N
-
*/
public int updateBits(int n,int m,int i,int j)
{
int allOnes=~0;//创建一连串1 假如为11111111
int left=allOnes<<(j+1); //在位置j之前的位均值为1,其余为0,此刻为11100000
int right=((allOnes<<i)-1);//在位置i之后的位均置位1,此刻为00000011
int mask=left | right; //进行位或运算之后得到 11100011
int n_cleared=n& mask; //清除位置j到i的位,然后将M放进去
int m_shifted=m<<i; //将M移动到相应的位置
return n_cleared | m_shifted; //对两者进行位或操作
}
public static void main(String[] args) {
// TODO Auto-generated method stub
BitGet bg = new BitGet();
int num=bg.updateBits(1024, 19, 2, 6);
System.out.println(Integer.toBinaryString(num));
}
Q5.2 二进制数转字符串
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
示例1:
输入:0.625
输出:“0.101”
示例2:
输入:0.1
输出:“ERROR”
提示:0.1无法被二进制准确表示
提示:
32位包括输出中的"0."这两位。
-
浮点数乘以进制2,取整数位添加到 二进制小数位后面
-
浮点数舍去整数位,重复以上过程直至浮点数变成 0,若无法等于 0,则无法精确表示
另参考:二进制小数 转 10进制
举例:将 二进制0.1111转换成 十进制数
二进制 0 . 1 1 1 1
----------------------------------------------------------------------------------------------------------------
换算次方 2^(0) 2^(-1) 2^(-2) 2^(-3) 2^(-4)
----------------------------------------------------------------------------------------------------------------
换成分数 0/2 1/2 1/4 1/8 1/16
----------------------------------------------------------------------------------------------------------------
换成十进制 0 + 0.5 + 0.25 + 0.125 + 0.0625 = 0.9375
class Solution {
public String printBin(double num) {
StringBuilder builder = new StringBuilder(“0.”);
for (int i = 0; i < 33; i++) {
num *= 2;
if (num >= 1) {
// 取整数部分
builder.append(“1”);
// 取完后减1取小数部分
num -= 1;
} else {
builder.append(0);
}
if (num == 0) {
return builder.toString();
}
}
return “ERROR”;
}
}
Q5.3 翻转数位
示例 1:
输入: num = 1775(11011101111)
输出: 8
示例 2:
输入: num = 7(0111)
输出: 4
Java简单迭代:
curLen记录当前长度,
preLen记录上次翻转后的长度,
因为只能翻转1次,所以需要再次翻转时curLen要减去preLen。
class Solution {
public int reverseBits(int num) {
int maxLen = 0, preLen = 0, curLen = 0, bits = 32;
while (bits-- > 0) {
if ((num & 1) == 0) {
curLen -= preLen;
preLen = curLen + 1;
}
curLen++;
maxLen = Math.max(maxLen, curLen);
num >>= 1;
}
return maxLen;
}
}
Q5.4 下一个数
下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。
示例1:
输入:num = 2(或者0b10)
输出:[4, 1] 或者([0b100, 0b1])
示例2:
输入:num = 1
输出:[2, -1]
提示:
num的范围在[1, 2147483647]之间;
如果找不到前一个或者后一个满足条件的正数,那么输出 -1。
手写下一个排列、前一个排列
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
总结:
各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。
文件夹有以下学习笔记,自行下载!
-
BAT大厂面试题、独家面试工具包,
-
资料免费领取,包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,
类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。 -
点击此处,与我们一起交流学习
文件夹有以下学习笔记,自行下载!
-
BAT大厂面试题、独家面试工具包,
-
资料免费领取,包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,
[外链图片转存中…(img-GXiUz0HZ-1710844775595)]