如何把一个数字x最右侧那个1拿出来,变成00…10…的格式

提示:异或运算重要知识点系列文章
只要了解异或运算的根本知识点,解决这些问题也就不在话下。

(1)认识异或运算的本质与基本规律,0^x=x,x异或x=0,有交换律,结合律,与顺序无关
(2)数组arr中,有一个数k出现了奇数次,其他数出现偶数次,请找到并打印这个数k


文章目录

  • 如何把一个数字x最右侧那个1拿出来,变成00...10..的格式
    • @[TOC](文章目录)
  • 题目
  • 一、审题
  • 二、解题
    • 暴力解
    • 异或运算最优解o(1)
  • 总结

题目

如何把一个数字x最右侧那个1拿出来,变成00…10…的格式


一、审题

示例:x=110100
获取最右侧那个1
ans = 000100


二、解题

暴力解

你可以这么做,比如将arr转换为字符数组
x=1 1 0 1 0 0
然后令ans=“”,为一个空字符串
待会遍历字符数组x
(1)i从N-1–0遍历
没有遇到1,则str+=" “;加空格
(2)一旦遇到第一1:
让str+=“1”;
然后剩下的位置i全部str+=” ";加空格

不好意思,有事o(n)的复杂度,如果N趋近于10^8,而最右边那个1巧了就是第一1位,其余全都是0,你惨了!!
暴力解失效了!

异或运算最优解o(1)

既然是数字中操作哪个位置的1,往往又要敏感地想到,这是异或运算可以干的事情,反正都是涉及二进制位的操作

这里直接硬核记一个结论: 下面是与x,不是异或哦
获取数字x最右侧1的办法:让x取反加1再与x
获取数字x最右侧1的办法:让x取反加1再与x
获取数字x最右侧1的办法:让x取反加1再与x

举例:x=110100
ans=000100

之所有取反+1,实际就是为了把x最右侧那个1,给它暴露出来,1以前就直接真的被取反了,但是咱还得把1和后面那些个0保留
故,x取反再加1呢,进位到最后把最后边那个1暴露了,后面都是0

再让一个最右侧位10000,的前面都取反了的数,与x,岂不是后面保留了,前边相反的数与一下,都为0了!
整个算目标就达成了,拿到了最右侧那个1

手撕代码,就一句话的事儿:复杂度o(1)
而且位运算,速度比四则运算快多了!!!能用位运算解决问题,一定是面试官欣赏的高手!!!

//怎么提取一个数中最右侧的1来,比如101010000100中倒数第二个1//公式:N&(~N+1):N取反加1再与自己——这里貌似和异或没关系public static void eorGetRightest1(){int N =10;String str10 = Integer.toBinaryString(10);//Java中无法表示二进制数,只能靠字符串表示System.out.println(str10);int rightest1 = N&((~N)+1);//不是异或,而是与&String str2 = Integer.toBinaryString(rightest1);System.out.println(str2);}

总结

提示:重要经验:

1)就记住一个结论,想获取x最右侧那个1,直接让x取反+1再与x就行
2)异或运算很经典的,非常有用,本文开头推荐写基础知识一定要掌握

如何把一个数字x最右侧那个1拿出来,变成00...10..的格式相关推荐

  1. 3D Touch介绍: 一个数字压力器App和Quick Actions

    随着iPhone 6s and 6s Plus的发布,苹果介绍了全新的手机交互方式:重按手势.你应该知道,这个特性其实早已应用在苹果手表和MacBook产品中,名字叫Force Touch.它给用户交 ...

  2. 用户输入一个数字,找到所有能够除尽它的数的总个数

    想不到我这个小学生也会做 <!DOCTYPE html> <html lang="en"> <head>  <meta charset=& ...

  3. 一个数字键盘引发的血案——移动端H5输入框、光标、数字键盘全假套件实现...

    https://juejin.im/post/5a44c5eef265da432d2868f6 为啥要写假键盘? 还是输入框.光标全假的假键盘? 手机自带的不用非得写个假的,吃饱没事干吧? 装逼?炫技 ...

  4. ACMNO.13求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。 输入 n 输出 和 样例输入 5 样例输出 153

    题目描述 求Sn=1!+2!+3!+4!+5!+-+n!之值,其中n是一个数字. 输入 n 输出 和 样例输入 5 样例输出 153 来源/分类 C语言 题目截图: 思路: 首先要想到使用两个for循 ...

  5. ACMNO.9求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。 例如:2+22+222+2222+22222(n=5),n由键盘输入。 输入 n 输出 a=2 时

    题目描述 求Sn=a+aa+aaa+-+aa-aaa(有n个a)之值,其中a是一个数字. 例如:2+22+222+2222+22222(n=5),n由键盘输入. 输入 n 输出 a=2 时的Sn 样例 ...

  6. edgeR:一个数字基因表达数据差异表达分析Bioconductor程序包

    edgeR:一个数字基因表达数据差异表达分析Bioconductor程序包 人们希望在不久的将来,对于许多功能基因组学应用,新兴的数字基因表达(digital gene expression,DGE) ...

  7. 猜数字游戏:随机键盘录入一个数字,看是否能猜正确

    package com.summer.cn;import java.util.Scanner;public class Test041505 {public static void main(Stri ...

  8. MODE —— 输入一个数字,求从1加到该数的和(知识点:for循环嵌套while循环)

    问题描述: 终端输入一个数字,求从1加到这个数字的和! 运行结果: 代码部分: #include <stdio.h> int main() {unsigned int sum = 1UL; ...

  9. 自动化测试(三)如何用python写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复。...

    写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复.邮箱前面的长度是6-12之间,产生的邮箱必须包含大写字母.小写字母.数字和特殊字符 和上一期一样 代码中间有段比较混沌 有 ...

最新文章

  1. extract_first()
  2. NSNotificationCenter
  3. 常见的垃圾回收器算法有哪些,各有什么优劣?
  4. python解释器有多大_python解释器到底是什么?
  5. 编译原理第一次上机作业感想
  6. loj136 (最小瓶颈路,多次询问)
  7. C语言编译-嵌入式系统
  8. vue slot的使用介绍
  9. PCL1.8.0 error C4996: 'pcl::SAC_SAMPLE_SIZE'编译错误
  10. 12.51单片机实现电子音乐盒
  11. 计算机图形点阵表示实例,计算机图形学的应用实例(计算机图形作业)精选.doc
  12. 桥本分数式c语言,《算法设计与分析教案(新格式)》.doc
  13. 华为手机照片如何出现时间地点天气,教你30秒,一学就会
  14. c语言 运行结果是空白的,为什么输出是空白
  15. Python模拟Tim登录界面
  16. 函数名和变量名重名问题
  17. 【NOIP2018 模拟赛04.14】 陪审团
  18. 怎么关闭excel出现的microsoft office 自定义安装程序提示
  19. 2021 ICPC Southeastern Europe Regional Contest 树上dfs+思维
  20. 谁能做到电商平台的公平性,谁就是下一任电商老大?

热门文章

  1. html中背景色优先级,CSS背景颜色优先级
  2. 全国计算机等级三级网络技术试卷详解(三)
  3. 2021年安全员-B证(广西省)考试报名及安全员-B证(广西省)考试试卷
  4. 网络计算机要不要用电脑,电脑连不上网怎么办 电脑连不上网解决方法
  5. 启明云端分享|IDO-SOM3568:可用于轻量级人工智能应用
  6. 计算机硬件工程师面试题集,硬件工程师笔试及面试问题
  7. 微信小程序配置多环境
  8. 分享一些个人觉得非常好用的软件吧
  9. 使用3DMAX制作一枚手雷
  10. Ubuntu 18.04使用百度网盘笔记