精华内容
下载资源
问答
  • 匿名用户1级2017-11-28 回答#首先说明一点,python有现成的函数可以干这个,只不过这个位数不会按照你想要的位数输出而已#这些函数是bin(),hex(),oct(),这些函数自己去看它的源码实现。#个人写的如下defaddone(mods)...

    匿名用户

    1级

    2017-11-28 回答

    #首先说明一点,python有现成的函数可以干这个,只不过这个位数不会按照你想要的位数输出而已

    #这些函数是 bin(), hex(), oct(),这些函数自己去看它的源码实现。

    #个人写的如下

    def addone(mods):

    assert isinstance(mods,list)

    tmods = mods.copy()

    if tmods:

    if tmods[0] == 0:

    tmods[0] = 1

    return(tmods)

    else:

    return([0] + addone(tmods[1:]))

    return([])

    hexmap = {

    "0000": "0",

    "0001": "1",

    "0010": "2",

    "0011": "3",

    "0100": "4",

    "0101": "5",

    "0110": "6",

    "0111": "7",

    "1000": "8",

    "1001": "9",

    "1010": "A",

    "1011": "B",

    "1100": "C",

    "1101": "D",

    "1110": "E",

    "1111": "F",

    }

    def convertToBinary(num, site=64):

    assert -2**(site - 1) <= num 

    mod = []

    quotient = abs(num)

    if quotient == 0:

    mod = [0]

    else:

    while quotient:

    mod.append(quotient % 2)

    quotient = quotient // 2

    mod += [0]*(site - len(mod) - 1)

    #if negative

    if num 

    #not

    mod = [ 0 if i else 1 for i in mod ]

    #add 1

    mod = addone(mod)

    #add sign

    mod += [1]

    else:

    mod += [0]

    return("".join([str(i) for i in reversed(mod)]))

    def convertToHex(code):

    clen = len(code)

    mod = clen % 4

    if mod != 0:

    if code[0] == 0:

    code = "0" * (4 - mod) + code

    else:

    code = "1" * (4 - mod) + code

    out = []

    for i in range(0,len(code),4):

    out.append(hexmap[code[i:i+4]])

    return("".join(out))

    #convertToBinary(33,16)

    #'0000000000100001'

    #convertToHex(convertToBinary(-33,64))

    #'FFFFFFFFFFFFFFDF'

    #convertToHex("1110001")

    #'F1'

    展开全文
  • 二进制和十六进制对于程序员来说应该是很熟悉的东西了,我也不知道为什么我现在还在看这个呢?^_^ 什么是二进制?什么是十六进制? 说到进制我们最熟悉的莫过于十进制了,我们从小学的数学都是用的十进制。所谓十...

    二进制和十六进制对于程序员来说应该是很熟悉的东西了,我也不知道为什么我现在还在看这个呢?^_^

    什么是二进制?什么是十六进制?

    说到进制我们最熟悉的莫过于十进制了,我们从小学的数学都是用的十进制。所谓十进制就是逢十进一,从0开始数 0、1、2、3、.....7、8、9,十个数了再下一个数就要进一位变成10(变成了两位数)。二进制就是逢二进一,0、1再下一个数就要进一位了变成10(变成两位数),十六进制数的道理也是一样的,从0开始数,0、1、2、.....7、8、9发现还没到十六个数还不能进一位,所以不能变成10,那怎么办?数字不够用那就用字母来凑,9后面接着数A、B、C、D、E、F,然后才进一位变成10。

    进制间的转换

    人类习惯看十进制的数,看到一长串的二进制数就一脸懵逼。计算机就只认二进制的数,看到十进制也是一脸懵逼。至于十六进制我想就是为了取个平衡吧(十六进制和二进制的转换会容易些)。

    什么叫进制的转换呢?比如说二进制中0、1后面的数是10(不读作“十”),我们知道在十进制中1后面是2,所以二进制中的10转换为十进制就是2,反过来十进制中的2转换为二进制就是10。当然进制间转换不能靠数。

    先从简单的二进制转十六进制说起:比如二进制101010110

    416111071d04cd4955f586adfb703b4e.png

    如图所示:将二进制每四位分为一组,不够四位的前面补0(例子中没补)。每一组都可以转换为一个十六进制的数,将这些数连在一起就是结果,也就是说上面的二进制转换位十六进制为156。那么每一个组里的二进制要怎么转为十六进制呢?

    4d81b3d7865908165a93d96840c45eb7.png

    从上图可知0110的值计算为0*8 + 1*4 + 1*2 + 0*1 = 6。如果4位全为1刚好是十六进制的F,这可以解释为什么是4位划分为一组了。

    十六进制转二进制刚好是一个相反的过程。将十六进制数的每一位转化为一个4位的二进制,然后连起来。

    502ea4f1371f11fb014065371dff9e42.png

    二进制转十进制的思路第二幅图的思路是一样的,只不过不分组就是了。例:

    73ca85493231ce90a38dcc580445e808.png

    十进制转二进制就比较麻烦了,要将十进制的数不断除2取余数,懒得写了丢个网上的图片:

    c64de583a58780fcb18717ddc0a5552f.png
    展开全文
  • 示例 1:输入: 5输出: True解释:5的二进制数是: 101示例 2:输入: 7输出: False解释:7的二进制数是: 111示例3:输入: 11输出: False解释:11的二进制数是: 1011示例 4:输入: 10输出: True解释:10的二进制数是: 1010答案...

    给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等。

    示例 1:

    输入: 5输出: True解释:
    5的二进制数是: 101

    示例 2:

    输入: 7输出: False解释:
    7的二进制数是: 111

    示例 3:

    输入: 11输出: False解释:
    11的二进制数是: 1011

    示例 4:

    输入: 10输出: True解释:
    10的二进制数是: 1010

    答案:

    1public boolean hasAlternatingBits(int n) {
    2    n ^= (n >> 1);
    3    return (n & (n + 1)) == 0;
    4}

    解析:

    这道题非常简单,一个数的二进制位如果是0和1交替,那么把这个数往右移一位然后再和原来的数进行异或运算,就会让他全部变为1(注意这里是忽略前面的0的,比如5在java语言中的二进制是32位,我们只考虑后面的101,不用考虑前面的29个0。)。我们来随便举个例子画个图看一下

    2c5c164018f23c861001bc189805c1c1.png

    所以他会把原来的位置上全部变为1,然后我们再加1,让他原来的位置全部变为0,然后在和原来的自己进行与运算,判断结果是否为0。

    2,加法实现

    上面的异或运算我们还可以改为加法运算,像下面这样

    1public boolean hasAlternatingBits(int n) {
    2    n += n >> 1;
    3    return (n & (n + 1)) == 0;
    4}

    3,逐个判断

    我们还可以使用最原始的方式,从右往左一个个判断0和1是否是交替出现的,代码也很简单,我们来看下

     1public boolean hasAlternatingBits(int n) {
    2    int pre = n & 1;
    3    for (int i = 1; i 32; i++) {
    4        if ((1 < n)
    5            break;
    6        int cur = (n >> i) & 1;
    7        if ((cur ^ pre) == 0)
    8            return false;
    9        pre = cur;
    10    }
    11    return true;
    12}

    第7行如果等于0,说明要么连续出现了0,要么连续出现了1,直接返回false即可。当然第7行的判断我们还可以再改一下,换一种思路

     1public boolean hasAlternatingBits(int n) {
    2    int pre = n & 1;
    3    n >>>= 1;
    4    while (n != 0) {
    5        if ((n & 1) == pre)
    6            return false;
    7        pre = n & 1;
    8        n >>>= 1;
    9    }
    10    return true;
    11}

    第5行如果成立,说明要么连续出现了0,要么连续出现了1,和上面很类似,不过实现方式上有些差别。或者我们还可以不使用任何临时变量,像下面这样每两两前后比较

    4,前后两两比较

    1public boolean hasAlternatingBits(int n) {
    2    while (n != 0 && (n >>> 1) != 0) {
    3        if (((n & 1) ^ ((n >>> 1) & 1)) == 0)
    4            return false;
    5        n = n >>> 1;
    6    }
    7    return true;
    8}

    或者我们还可以把它给为递归的写法

    5,递归实现

    1public boolean hasAlternatingBits(int n) {
    2    return n 3 || ((n % 2) != (n / 2 % 2)) && hasAlternatingBits(n / 2);
    3}

    6,移两位计算

    再来想一下,前面我们把n往右移一位然后在与自己进行异或运算,我们能不能把n先往右移两位在进行异或运算呢,其实也是可以的,我们来画个图分析一下

    b08415bc7b4cf9642759775c454ec5c9.png

    我们只需要计算异或的结果类似于10000…这种形式的就可以了,所以代码很简单,直接一行搞定

    1public static boolean hasAlternatingBits(int n) {
    2    return ((n ^= n >> 2) & (n - 1)) == 0;
    3}

    我们来找几个数据测试一下

    1    System.out.println("二进制0b111是不是0和1交替出现的:" + hasAlternatingBits(0b111));
    2    System.out.println("二进制0b101是不是0和1交替出现的:" + hasAlternatingBits(0b101));
    3    System.out.println("二进制0b1010101010是不是0和1交替出现的:" + hasAlternatingBits(0b1010101010));
    4    System.out.println("二进制0b1010101011是不是0和1交替出现的:" + hasAlternatingBits(0b1010101011));

    看一下打印的结果

    1二进制0b111是不是0和1交替出现的:false
    2二进制0b101是不是0和1交替出现的:true
    3二进制0b1010101010是不是0和1交替出现的:true
    4二进制0b1010101011是不是0和1交替出现的:false

    结果完全正确

    7,乘以3计算

    我们接着往下思考,如果n是0和1交替出现的,那么会有两种情况,一种是以0结尾的,比如101010,一种是以1结尾的,比如1010101,无论哪种情况我们把它乘以3会有一个奇怪的现象,因为是0和1交替出现,0乘以3还是0,1乘以3是11(二进制),所以不会出现一直往前进位的问题,我们来看下代码

    1public static boolean hasAlternatingBits(int n) {
    2    return ((n * 3) & (n * 3 + 1) & (n * 3 + 2)) == 0;
    3}

    我们还是来找几组数据来测试一下结果

    1    System.out.println("二进制0b111是不是0和1交替出现的:" + hasAlternatingBits(0b111000));
    2    System.out.println("二进制0b1010101010是不是0和1交替出现的:" + hasAlternatingBits(0b1010101010));
    3    System.out.println("二进制0b10101010101是不是0和1交替出现的:" + hasAlternatingBits(0b10101010101));
    4    System.out.println("二进制0b1010101011是不是0和1交替出现的:" + hasAlternatingBits(0b1010101011));

    再来看一下打印结果

    1二进制0b111是不是0和1交替出现的:false
    2二进制0b1010101010是不是0和1交替出现的:true
    3二进制0b10101010101是不是0和1交替出现的:true
    4二进制0b1010101011是不是0和1交替出现的:false

    结果完全在我们的预料之中。这种解法一般我们不太容易想到,但也不提倡使用,会有一些小的问题,因为如果n比较小的话是没问题的,如果n比较大的话,那么n*3就会出现数字溢出,导致结果错误。如果想写这种解法,最好先把n转为long类型就可以了。

    8,使用java类库

    如果允许的话我们还以使用java类库提供的方法先进行转换,然后再进行判断也是可以的,代码比较简单,我们来看下

    1public boolean hasAlternatingBits(int n) {
    2    String s = Integer.toBinaryString(n);
    3    for (int i = 0; i 1; i++) {
    4        if (s.charAt(i) == s.charAt(i + 1)) {
    5            return false;
    6        }
    7    }
    8    return true;
    9}

    这种就非常好理解了,但对于二进制位的考察相对就弱了很多,或者我们还可以更简洁一些

    1public static boolean hasAlternatingBits(int n) {
    2    String binary = Integer.toBinaryString(n);
    3    return !binary.contains("00") && !binary.contains("11");
    4}

    9,总结

    这道题难度不大,其实解法还是挺多的,主要考察的是对二进制位的熟练使用,如果上面的所有解题思路都能掌握,代码也都能看的懂,那么对二进制位的操作也算是比较熟练的了,但远达不到精通,因为关于二进制位运算的技巧还是非常非常多的,不是这一篇文字就能讲的清楚的,后续也会有一系列对二进制位运算的介绍。

    展开全文
  • 功能描述:统计一个数字转为二进制后,0和1的个数,组成数组返回 输入:6 输出:{1,2} import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * 功能描述:统计一个数字转为二进制后,0...

    第十四题

    • 功能描述:统计一个数字转为二进制后,0和1的个数,组成数组返回
    • 输入:6
    • 输出:{1,2}
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 功能描述:统计一个数字转为二进制后,0和1的个数,组成数组返回
     * 输入:6
     * 输出:{1,2}
     * @author lx
     *
     */
    public class Test {
    
    	public static void main(String[] args) {
    		int[] result = getNum(6);
    		System.out.println(Arrays.toString(result));
    	}
    	
    	public static int[] getNum(int data) {
    		// int转换为二进制数并为String类型
    		String dataStr = Integer.toBinaryString(data);
    		// 利用map计算0 1个数
    		Map<Character, Integer> map = new HashMap<Character, Integer>();
    		for (int i = 0; i < dataStr.length(); i++) {
    			Integer integer = map.get(dataStr.charAt(i));
    			map.put(dataStr.charAt(i), integer == null ? 1 : integer + 1);
    		}
    		int[] result = new int[2];
    		result[0] = map.get('0');
    		result[1] = map.get('1');
    		return result;
    	}
    	
    }
    
    展开全文
  • 第一章 数字系统本章提要:十进制数与二进制数十进制数与二进制数之间的转换八进制数与十六进制数二进制数的运算十进制数与二进制数在我们所生活的现实世界中,几乎全部的计数方式都是采用十进制数字。但是在计算机...
  • 在交互模式下,上一次打印出来的表达式被赋值给变量 _ In [8]: 2*3.02+1Out[8]: 7.04In [9]: 1+_Out[9]: 8.04 6 十转二 将十进制转换为二进制: >>> bin(10)'0b1010' 7 十转八 十进制转换为八进制: >>> ...
  • 功能描述:统计一个数字转为二进制后,0和1的个数,组成数组返回 输入:6 输出:{1,2} 二、算法分析  要把一个数字转为二进制就得为这个数字不断取余数 ,如果能整除则为0 ,否则为1. 三、算法/** * Gets ...
  • Javascript 完全套用了 Java 的位运算符,包括按位与&、按位或|、按位异或^、按位非~、左移<<、带符号的右移>>和用0补足的右移>...如果使用它们的话,Javascript 不得不将运算数先转为整数,...
  • 数字转为二进制的字串

    千次阅读 2014-03-14 12:21:36
    怎么把一个整数字转为二进制的字符串 这个当然简单了 >>>bin(3) '0b11' 但是如果我不想要0b,而且前面补齐0为8位二进制呢? def tobinList(n):   s1=['0']*(8-(len(bin(n))-2))  #print('s1= ',s1) 把bin的...
  • 以下内容纯属个人理解,仅作参考如果需要word版...进制转换 :略第章1.必备知识:TTL与非门的工作原理 P27OC门:集电极开路门电路 “线与”功能 符号集电极负载电阻RL不能太大也不能太小三态门:注意控制端是低电...
  • } } 方法:位运算 import java.util.Scanner; public class homeWork1 { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int n=scan.nextInt(); int count=0; while...
  • 封面图片来源:沙沙野内容概览格式化输出的基本用法...# % 代表占位符,%s 代表字符串,%d 代表数字 # 如果不确定用户输入的是什么类型,统一用 %s 即可 name = input("请输入姓名: ") age = input("请输入年龄...
  • print()函数print()函数(打印函数)由两部分构成:1. 指令:print;2. 指令的执行对象:在... ”作为行结尾输出的字符串中含有引号时(使用双引号):print( “let’s do it ”)输出数字:如:print(520)输出算术结果...
  • 只能约定常量的命名规则,以及在程序的逻辑上不对常量的值做出修改 数字 // 整数除法 7//2 -> 3 ** 幂 2**3 -> 8 divmod()函数同事得到商和余数 : divmod(13,3) ->(4,1) 返回元组 0b或者0B -> 二进制 0o或者0O -> 八...
  • 3.企业数字化建设过程中核心采集的数据有哪些?又是如何利用数据赋能业务的?背景世界正在进入以信息产业为主导的经济发展时期,在新一轮的科技革命和产业发展变革中,智能制造已成为世界强国抢占发展机遇的制高点和...
  • oct(number) print("十进制数:{} 转为八进制为:{}".format(number,eight_format))# 十进制转二进制def ten_two(number): two_format = bin(number) print("十进制数:{} 转为二进制为:{}".format(number,two_...
  • C/C++:十进制转为二进制(n进制转为十进制)

    万次阅读 多人点赞 2016-12-05 23:13:33
    这里值得注意的是,计算的第一位数字其实是待输出的二进制数的最后一位,(所以这里可以定义一个数组来存放二进制数0或1;当然也可以采用函数递归来实现);要获得下一位数字,必须把原数字除以2。如果计算结果是...
  • Private Sub Command1_Click() Dim a As Integer Dim b As Integer Dim s As String Dim ys As Integer ...a = m: b = 16 (m为任意二进制数) While a ys = a Mod b s = f(ys) & s a = a \ b Wend Pr
  • 本文介绍了python十进制和二进制的转换方法(含浮点数),分享给大家,也给自己留个笔记,具体如下:我终于写完了 , 十进制转二进制的小数部分卡了我将近一个小时上代码#-*- coding: utf-8from decimal import ...
  • 1.将ip中的数字转为二进制 后形成新的二进制 计算出新二进制的int值 转为二进制后 会出现两位“0b”标识位 转为十进制时候应该考虑将这两位去掉 ip地址中都是点分八进制 ==>应该将每个二进制数省略不写的前缀0位...
  • 数字识别之图像转为二进制数据

    千次阅读 2018-01-18 08:39:02
    现在来实现如何将一个图片数字转为二进制的数据,并保存到为本中 图片是32x32的一个白底黑字的png图片 使用PIL模块获取像素,进行比对 存储数字二进制文件,方便后续训练数据使用 代码在github托管 部分代码展示 #...
  • java中的字符转整数 char c="10" String s1=String.valueOf(c);//将从转换为字符串 int num1=Integer.valueOf(s1);//2 将字符串转换为整数 ...十进制转为2进制 String bin=Integer.toBinaryString(sum1+sum2);
  • 以前一直没有关注过int型数字是怎么转换成二进制,十六进制的呢?虽然以前面试的时候也被问到过,却一直不知道Java内部是怎么实现的。所以今天就看了下Integer的静态方法toHexString(int i), toOctalString(int i), ...
  • 2.输出对应数字二进制和十六进制形式,二进制的长度不超过16位,不够十六位在前面加0不全,十六进制不超过4位,不够补0.多了截掉。 3.输入的必须是十进制数字,输入其他字符则报错。 思路: 1.输入数字 2.对...
  • 二进制转为十进制数 //二进制转十进制 public static void binaryToDecimal1(String n) { int t = 0; // 用来记录位数 int bin = 0; // 用来记录最后的二进制数 int r = 0; // 用来存储每一位的数字 for...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 632
精华内容 252
关键字:

数字转为二进制