精华内容
下载资源
问答
  • 假设这么一个函数valueAtBit(num, bit),输入一个十进制数num,求它的二进制数的bit是多少(注意bit应该从1算起) 以下是种实现方法的总结: 方法一,最硬核的方法 这个方法模拟了平时我们计算二进制数的过程...

    题目描述:
    假设有这么一个函数valueAtBit(num, bit),输入一个十进制数num,求它的二进制数的bit位是多少(注意bit应该从1算起)
    以下是几种实现方法的总结:

    方法一,最硬核的方法

    这个方法模拟了平时我们计算二进制数的过程:

    1. num除以2,求出得商和余数(假设商为resu,余数为rest)
    2. 拿上次的商resu再除以2,求得新的商resu和本轮的余数rest
    3. 重复1、2步操作,直至商resu为0
    4. 倒序将所有的余数rest拼接即为该十进数的二进制表示

    将上述过程实现成js代码如下:

    function valueAtBit1(num, bit) { // 方法一
    	var result = [];
    	var rest = 0;
    	var resu = num;
    	while (resu != 0) {
    		rest = resu % 2;
    		resu = parseInt(resu / 2);  // 这里不要漏掉将小数转成整数
    		result.push(rest);  // 这里的数组即为存储二进制数的各个位数(字符类型)
    	}
    	return result[bit - 1];  // 这里是应题目要求,求bit位的
    }
    

    方法二,使用js自带方法toString

    function valueAtBit2(num, bit) { // 方法二
    	var binary = num.toString(2);
    	return binary[binary.length - bit];
    }
    

    toString接收一个参数radix(基数),表示你要把该数字对象(注意是数字对象才包含该方法,不可以是字面量)转成几进制的字符串。

    方法三,使用移位操作

    function valueAtBit3(num, bit) { // 方法三
    	return num >> (bit - 1) & 1; //下面两种不可以, 因为只有与运算才能把除第一位以外的其他位“置零”.
    	// return num >> (bit - 1) | 0;
    	// return num >> (bit - 1) ^ 0;
    }
    

    这个方法是跳过求二进制数这个过程,直接求bit位的,因为移位操作只能是对二进制进行运算,所以这里可以直接用num,>>会隐式转换成二进制。
    这个方法的原理是这样的:(不过如果大家看不懂以上的语句,建议在这之前先看一下位运算的基础知识哈)

    1. 先让所求位向右移到第一位,这时左边空出来的位会自动补0,先叫它“已移位的num”
    2. 让移位操作后的这个数和1相与(1的二进制除第一位左边全为0),这样相与了之后,得到的结果是除第一位之外的其他位都变为0,此时按照相与运算的运算规则:- 如果“已移位的num”第一位是0那么相与之后是0;- 如果“已移位的num”第一位是1那么相与之后是1。此时返回的结果便是所求。

    可能我陈述得有点乱,不过大家可以亲测一下,原理很巧妙哦。

    方法四,仅使用位相与操作

    function valueAtBit4(num, bit) { // 方法四
    	var binary = Math.pow(2, bit - 1);
    	return (num & binary) == 0 ? 0 : 1; // ==比&优先级要高所以需要加括号
    }
    

    该方法与方法三有点相似,不过这个方法不需进行移位操作,而是先生造一个与所求位匹配的二进制数,让它们俩相与,如果结果为非零则返回1,结果为零则返回0
    比如说要求29的二进制数的第3位,那么过程如下:

    1. 29 的二进制表示为 11101(这个过程由位操作符自动转换)
    2. 求第 3 位,那么生造一个二进制数 00100(除所求位为1,其他位为0),能达到这个效果的就需要用到Math.pow()这个方法了
    3. 让1、2步的这两个数进行位相与,结果是除所求位之外的其他位变为0,所求位如果原来是1则相与之后该位为1;,所求位如果原来是0则相与之后该位为0;(在本例中结果为 00100)
    4. 通过三元表达式判断结果并返回:判断第3步的结果是否为0,如果为零则返回0,如果非零则返回1(在本例中,结果00100即为十进制的4,非零,所以返回1)

    我们可以验证一下结果,返回的1在原来的11101的第三位中确实是1,大家也可以验证看看其他位。原理也比较巧妙哦。
    其中方法三和方法四学自牛客网的巨佬们,在这里要谢谢各位巨佬们。
    同时也感谢读者们能读到最后,阿里嘎多~

    展开全文
  • 统计俩个二进制数不同的位数

    千次阅读 2017-07-29 13:00:27
    如题 : 给定俩个十进制的整数,求解对应的二进制不同的位数有几位 测试数据 : 1999,2999 输出 : 7 思路 : 使用异或,异或运算相当于没有进位的加法运算,故该位为1表示对应位不同,对异或得到的值进行统计1的个数则...

    如题 : 给定俩个十进制的整数,求解对应的二进制不同的位数有几位

    测试数据 : 1999,2999

    输出 : 7

    思路 : 使用异或,异或运算相当于没有进位的加法运算,故该位为1表示对应位不同,对异或得到的值进行统计1的个数则得出结果


    展开全文
  • 二进制的位数,字节、字符

    万次阅读 2016-08-11 21:23:02
    二进制位数,也就是表达一个其他类型数所需要的二进制数有几个,确定整数二进制表示中第一个1 出现位置。 例如:  2二进制为 10,占用2个二进制  3二进制为 11,占用2个二进制  4二进制为 100...

    1.位数

    • 二进制位数,也就是表达一个其他类型的数所需要的二进制数有几个,确定整数二进制表示中第一个1 的出现位置。
      例如:
       2的二进制为 10,占用2个二进制位
       3的二进制为 11,占用2个二进制位
       4的二进制为 100,占用3个二进制位
    • 再例如,int型是32位,什么意思呢,也就是所它最大可以占32个2进制位 也就是100000000000000000000000000000,它的最高位在第32个二进制数上
      那为什么int的最大取值不是2(32)+2(31)·····呢,因为它的最大取值就是2的31次方,而1也正好在二进制位数的32个数字上,所以它是32位的。

    2.字(word)字节(byte)、字符 、位数(bit)

       1word = 2byte=16bit

    • 位:bit
    • 字节(Byte):是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。1byte = 8bit
    • 字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。
    • 它们完全不是一个位面的概念,所以两者之间没有“区别”这个说法。不同编码里,字符和字节的对应关系不同:

      ASCII码中,一个英文(字符)字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。

      UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

      Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。

      符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。

      UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。

      UTF-32编码中,世界上任何字符的存储都需要4个字节。

      摘自:http://zhidao.baidu.com/link?url=U1Y4UO2Fdm63eh2bVjFONKSqaw6Ub0FQR4j1WmduuEcjop4lDsBy7dWdNR51Dnuny52cnh22CEhrhlytZwty_25xJ1GhNP9RuHXbAkLqDMa
    展开全文
  • 461 统计两个数的二进制表示有多少不同 输入: x = 1, y = 4 输出: 2 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 解题思路:把x和y异或,1的个数代表两个数不同的位数 统计一个二进制数字的1的位数有: 1 转换为二进制字符串...

    LeetCode应用题目:
    461 统计两个数的二进制表示有多少位不同

    输入: x = 1, y = 4
    输出: 2
    1 (0 0 0 1)
    4 (0 1 0 0)
    ↑ ↑

    解题思路:把x和y异或,1的个数代表两个数不同的位数
    统计一个二进制数字的1的位数有:
    1 转换为二进制字符串统计1的个数(速度最慢)

    public int hammingDistance(int x, int y) {
            int xor = x^y;
            String xo = Integer.toBinaryString(xor);
            int cnt = 0;
            for(int i = 0;i<xo.length();i++){
                if(xo.charAt(i)=='1')
                    cnt++;
            }
            return cnt;
        }
    

    2 做&运算,判断最低位是否为1,然后右移一位,直到该数为0为止

    public int hammingDistance(int x, int y) {
            int xor = x^y;
            int cnt = 0;
            while(xor!=0){
                if((xor&1)==1)
                    cnt++;
                xor=xor>>1;
            }
            return cnt;
        }
    

    3 用n&(n-1)来去除最后一个1,直到该数为0为止判断进行了多少次操作(速度最快)

    public int hammingDistance(int x, int y) {
            int xor = x^y;
            int cnt = 0;
            while(xor!=0){
                xor = xor&(xor-1);
                cnt++;
            }
            return cnt;
        }
    

    4 使用Integer.bitCount()方法

    public int hammingDistance(int x, int y) {
            int xor = x^y;
            return Integer.bitCount(xor);
        }
    
    展开全文
  • 其实就是比较个IP网络前缀,相同部分多少, 这多少就是聚合后IP, 子网掩码就是把相同网络前缀变为1,剩下为0, 算出十进制就可以了。下面举例说明一下: 例1: 某企业分配给产品部IP地址块为...
  • 转换:Java整型数据类型:byte、char、short、int、long。要把它们转换成二进制的原码形式,必须明白他们各占个字节。,一个字节==8位数数据类型 所占位数byte 8boolean8sh...
  • 如果你是用01字符串来表示二进制,那么matlab现成的函数circshift可用,方法是:circshift(a',-n)'只需要输入二进制字符串a和需要左移的位数n就可以调用来得到答案,举个例子:>> a = '10011110'; n = 1; ...
  • 判断一个数的二进制有几个1, 通常想到的办法是不断右移,不断判断(记住右移与左移是针对二进制中所有位数的,并非简单末尾指针的移动) 代码如下: int fib(int n)//还可以继续优化 { int count=0; for(int i=0;i...
  • 计算机的二进制

    2020-02-02 15:15:34
    10进制到9就加进一: 10进制是 个 百位 千位 万位 … ...在2进制位数有几个2,那么数字就有几个0 10进制转2进制 2进制转10进制 将这些加起来,就是10进制的数...
  • 循环次数等于整数二进制的位数; 3、将该减1后与原进行与运算,会将最右边的1变为0,将进行与运算后的记赋值给n,则原n有几个0就进行几次循环。 三、代码 public class Solution { public int NumberOf1(int ...
  • 转换:Java整型数据类型:byte、char、short、int、long。要把它们转换成二进制的原码形式,必须明白他们各占个字节。,一个字节==8位数数据类型 所占位数byte 8boolean8sh...
  • 【问题描述】: 两个int(32)整数m和n的二进制表达中...我们先将两个异或在一起,那么它的二进制有几个1,就有几位数不同。怎么求一个数二进制中1个数,请看我前边写过一篇博客------&gt;【参考代...
  • 二进制 字节 字符

    2017-11-16 16:21:21
    1.位数二进制位数,也就是表达一个其他类型数所需要的二进制数有几个,确定整数二进制表示中第一个1 出现位置。例如: 2二进制为 10,占用2个二进制 3二进制为 11,占用2个二进制 4二进制为 100,占用...
  • 搞了这么久程序,还是对进制和转化... 每一位称为一个bit位,有多少个bit位,这个二进制数有几位。如该数有8个bit位。   2. 数据类型与二进制位数: 1 个字节 有 8 个bit位 即: 1Byte = 8bit 1 个字 有 ...
  • 转换: Java整型数据类型:byte、char、short、int、long。要把它们转换成二进制的原码形式,必须明白他们各占个字节。,一个字节==8位数 数据类型 所占位数 byte 8 boolean...
  • JAVA的位运算与二进制转换

    千次阅读 2017-06-09 11:54:22
    Java的位运算符与二进制转换 转换: Java整型数据类型:byte、char、short、int、long。要把它们转换成二进制的原码形式,必须明白他们各占个字节。,一个字节==8位数  数据类型 所占位数  byte 8  ...
  • 方法:循环次数等于1个数,即整数-1结果和整数本身做与运算,会将最右边1变为0,它之后的数变为1,它之前不改变,那么有几个1,就会做几次这样循环 代码 public class NumberOf1 { //方法一:循环...
  • 题目实现一个函数,输入一个整数,输出该数二进制表示中1个数题目分析拿到这个题目,所有人肯定立马了思路,个关键词立马在脑海中显现:“循环”,“右移”,“与”。然后很快写出了函数,随便输入验证...
  • 两个数的二进制位数差异有几个? 先转换成二进制格式 A = 1100100 B = 0110010 掰指头用眼睛数一下,是4个不同。 那么对比的方式可以用XOR解决。 A XOR B = 1010110那么不同的就转换...
  • 笔者某次面试银行时候,就被问到一个数学问题,说一个四位数的完全平方aabb,问它是谁平方。2分钟,无纸笔。笔者当场虽然发现了这个aabb一些特征,但关键步骤上,还是通过心算强行搞出来。大家如果...
  • 二进制中学砝码称重问题问题。如果我们1,10,100,1000,10000这五种砝码,我们就可以称出11111以内所有重量。如果不能表示为2n−12^n-12n−1,比如110,那么我们至少需要1,10此时不能拿到100因为他们加...
  • 1 不要化成十进制求和再返回二进制,因为二进制String位数有可能非常多,没法进行计算,因此一进行运算才行 2 String是无法用索引得到里面字符,要用charAt(index)方法 3 想要得到字符转int,用 (int)字符...
  • 阶乘问题三部曲----(1、第一个阶乘位数大于10000的数. 2、9999阶乘位数. 3、任意阶乘位数) 看到诸位大佬都写博客习惯后,这次...9999阶乘位数二进制位数)。 任意阶乘位数(十进制)。 这个...
  • 求出不相同的位数是哪些位,异或^,x^y,求出的结果为1的位数即为不相同的位数2求出为1的位数有几位,可以采用以下思路将异或后的结果设为a=x^y,如果a!=0,count++;将a中最后一个1变为0;(采用a&amp;a-1实现,eg...
  • int型数值占内存4个字节,就是4 * 8 = 32个字符。如果二进制每一上都判断是否为1的话,...移位运算符将左操作数的二进制向左/右移动数个位置,至于移动个位置,由右操作数指定。移位数值与移动位数都要求是整数。
  • 二进制 1.32个字节?  1字节=8(bit);所以32就是4个字节。 2.01011100对应十进制是多少?...3.00001111左移两结果是多少?...减一,逐取反,得到正常编码的二进制数。 1111 1110—
  • Problem C: 编写函数:求整数的位数 (Append Code) Description 输入一个十进制的整数,它共有几位数字组成? 编写一个函数digits(),其原型为: int digits(int n); 功能:返回n的十进制位数。 函数的调用...
  • 程序员二进制计算器 v1.36

    热门讨论 2014-07-16 16:21:43
    (1)二进制数 以0b或0B开头,后面0、1数字之间可以用空格分隔。 0b1001 = 9 0b 1001 0110 = 0x96 = 150 0B1001 0110% = 150% = 1.5 (2)八进制数 以0开头: 010 = 8 027 + 7 = 23 + 7 = 30 (3)...
  • 题目让求从a加到b的二进制进位次数之和。题目给的是从a到b每次进行两个数的加法,然后求和。 自己YY一下就知道可以从a到b一起做加法...现在的麻烦是怎么统计a到b的二进制的各位上有几个1。通过找规律我们知道:对于二
  • Redis二进制数组Bitmap

    千次阅读 2019-03-20 20:13:50
    好久没有更新了,之前公司在做 关注/粉丝 这块儿缓存时候,我选择就是 Bitmap ,那时是我第一次见识到这种数据数组形式,用到的有 SETBIT , GETBIT , BITCOUNT ,命令如何使用就不说了,今天来仔细看看这三个...

空空如也

空空如也

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

二进制数的位数有几位