精华内容
下载资源
问答
  • 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路需要一个循环结构,不断对输入数进行 无符号 右移动。在循环体的结构当中,使用适当的过滤器(1 这个整数)对输入数进行 逻辑与(&)操作:...

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

    思路需要一个循环结构,不断对输入数进行 无符号 右移动。

    在循环体的结构当中,使用适当的过滤器(1 这个整数)对输入数进行 逻辑与(&)操作:结构为 1 的时候计数(count)增加 1;否则选择跳过继续执行循环 结构。

    当 无符号右移 操作执行到终点时候(输入数变成 0),终止循环,同时返回最终计数的变量。

    位运算基础知识

    计算机对有符号数(包括浮点数)的表示有三种方法:原码、反码和补码(补码 =反码 + 1)。在 二进制里,是用 0 和 1 来表示正负的,最高位为符号位,最高位为 1 代表负数,最高位为 0 代表正数。以 8 位的 byte 为例,最大值为:0111,1111,最小值为 1000,0000。

    以此类推,在 Integer 的情况下,-5(toBinaryString)的结果为:1111,1111, 1111,1111,1111,1111,1111,1011。

    右移

    打印 -3 >> 1:-2。这里看一下具体的计算过程(正数左补 0,负数左补 1):Integer.toHexString(-3) 得到 3 的 16 进制:0xfffffffd(此为-3的补码,计算机中负数用补码表示)。

    将其转换成2进制为1111,1111,1111,1111,1111,1111,1111,1101。

    右移一位得到:1111,1111,1111,1111,1111,1111,1111,1110,显而易见此为-2补码。

    左移

    打印 -3<<1:-6。左移相对来说比较简单(正负数皆右补 0):-3 的二进制为:1111,1111,1111,1111,1111,1111,1111,1101。

    左移一位为:1111,1111,1111,1111,1111,1111,1111,1010,其为-6的补码。

    无符号右移

    打印 -3<<1:2147483646。遵循的原则:正数左补 0,负数左补 1:-3 的二进制为:1111,1111,1111,1111,1111,1111,1111,1101。

    无符号右移,高位补 0 得到:0111,1111,1111,1111,1111,1111,1111,1110,其为 2147483646 的补码/原码(正数的原码和补码相同)。

    消失的无符号左移

    为什么没有无符号左移?

    因为左移是在后面补 0,而右移是在前面边补 1 或 0,有无符号是取决于数的第一位是 0 还是 1,所以右移是会产生到底补1还是0的问题。而左移始终是在右边补,不会产生符号问题,所以没有必要无符号左移 <<

    常规代码实现

    根据上述的思路和基本概念,这里用 JS 来对这道题进行解答:

    function NumberOf1(n) {

    // write code here let count = 0

    for(;n != 0; n >>>= 1) {

    if(n & 1) {

    count++

    }

    }

    return count

    }

    Python 中遇到的问题和解决方法

    Python 中没有无符号右移

    在 JS 中,可以使用 a >>> b 来实现无符号位移,Python 中没有这个运算符,只能自己实现了 无符号右移 >>>:就是将有符号 int a 和 b 转为无符号 uint 后,再进行普通右移 >> 运算。比如 -1 的有符号 int 就是 -1,无符号 int 就是 4294967295。

    因为 Python 中没有 无符号右移,因而不能对最高位补 0,对于 负数 还是继续用 1 补进,这样就没有办法正确的统计 1 的个数。

    解决方法

    解决前:Python:打印 -3 >> 1,输出 -2(不符合要求)

    JavaScript:打印 -3 >>> 1,输出 2147483646(符合要求)

    解决后:Python:打印 (-3 & 0xffffffff) >> 1,输出 2147483646(符合要求)

    原理:负数与边界数按位与(&) 操作后 得到的是对应二进制数的真值:-3 & 0xffffffff —> 4294967293

    此时再在 Python 当中对其进行正常右移 >> 操作则是对一正数进行右移,前面补 0,符合要求;如果没进行这一步操作,右移依然是针对负数来进行操作的,前面补 1,不符合要求。

    代码实现

    有了以上的原理铺垫,在 Python 的代码当中,在第一次右移操作之前,先对被操作数进行和边界数 0xffffffff 的 与 & 运算,可得到正确的执行结果:

    class Solution:

    def NumberOf1(self, n):

    # write code here

    count = 0

    n = n & 0xffffffff

    while n != 0:

    if (n & 1) == 1:

    count += 1

    n = n >> 1

    return count

    其他的解决办法

    class Solution:

    def NumberOf1(self, n):

    # write code here

    M1 = 0x55555555

    M2 = 0x33333333

    M4 = 0x0f0f0f0f

    M8 = 0x00ff00ff

    M16 = 0x0000ffff

    n = (n & M1) + ((n >> 1) & M1)

    n = (n & M2) + ((n >> 2) & M2)

    n = (n & M4) + ((n >> 4) & M4)

    n = (n & M8) + ((n >> 8) & M8)

    n = (n & M16) + ((n >> 16) & M16)

    return n

    展开全文
  • 【运算赋值 四则运算 浮点型数据 二进制 布尔运算 int函数】今天,我们继续探究两个变量数据的互换的更多方法。我们先来看一段代码,猜测一下:程序运行的结果是什么?i=6j=9i=i+jprint("i=",i,"j=",j)运行结果是:i...

    【运算赋值 四则运算 浮点型数据 二进制 布尔运算 int函数】

    今天,我们继续探究两个变量数据的互换的更多方法。

    我们先来看一段代码,猜测一下:程序运行的结果是什么?

    i=6j=9i=i+jprint("i=",i,"j=",j)

    运行结果是:i=15 j=9

    注意:要理解这句代码 i=i+j,代码是从左到右写的,但是理解的顺序却需要从右向左。这句代码的意思是将变量 i和变量j相加的和重新赋值于变量i。

    e3e3799c0664dd951318bb348dd3b52d.png

    上述代码运行的结果得出 i=15,j=9,那么,i-j=15-9=6 这个数据值6刚好是变量 i 的初始值,如果我们将i-j=6这个值重新赋予变量 j,不就实现了两个变量数据互换的一步吗?

    这种想法是否正确?我们来写段代码尝试一下。

    i=6j=9i=i+jj=i-j #你能看出程序代码中变量i和变量j的变化与不变化吗?print("i=",i,"j=",j)
    运行的结果是:i= 15 j= 6,看到没有:变量j的初始值是9,现在变量 j 的数据值已经变成变量i的初始值了,变量i的数据已经换到变量 j 了。现在剩下的一步,便是将变量 i 的值换成9。你是否已经有了想法了?
    i=6j=9i=i+jj=i-ji=i-jprint("i=",i,"j=",j)
    运行结果如何?i=9 j=6 成功实现了两个变量的数据交换。这种数据交换方式只能在变量是数值的情况下实现。如果变量中的数据类型是字符串,这种方法就只能作罢。

    我们是不是可以在这个思路上拓展一下呢?比如我们不用两个变量之和,而是借助两个变量之积呢?

    大胆尝试:

    i=6j=9i=i*jj=i/ji=i/jprint("i=",i,"j=",j)

    运行的结果是:i=9.0 j=6.0 为什么数值会有了小数的精确位?原来Python变量的数据类型中的数值包括int(整型)和float(浮点型)等类型在Python中小数采用浮点数类型。

    什么是浮点数float?

    说得直白一点浮点数就是有小数点的数,比如:0.21、3.989……

    电脑在处理浮点数的时候,却不是百分之百的精确。

    我们都知道:0.1+0.2=0.3,但是如果在python程序中编写这段代码:

    0.1+0.2==0.3 # 注意:==表示等于,=只表示赋值

    运行这段代码,结果显示:False

    0.1+0.2难道不等于0.3吗?不等于0.3,等于多少呢?我们用python来计算一下0.1+0.2,代码如下:

    print(0.1+0.2)

    运行的结果是:0.30000000000000004

    为什么0.1+0.2在python程序里不等于0.3,却等于0.30000000000000004呢?后面的0.00000000000000004是怎么回事呢?

    原来这是因为电脑程序在进行数值运算时,首先会将十进制的数值转换成二进制数值,再进行计算,而小数转换成二进制时会出现误差!

    那就让我们来看看二进制吧:

    二进制是满二进一位的一种计数进制,是和满十进一位的十进制不同的计数进制。

    a5e406c1893cbc7270659f07d9a3a4a6.png

    十进制和二进制的数是如何转换的呢?我们今天探究一下十进制数转换成二进制数。

    先探究十进制整数转换成二进制。整数转换二进制数就是不断除以2。

    f277250271201310b996113b617bb2f3.png

    再探究十进制小数转换成二进制。小数转换二进制就是不断乘以2。

    十进制的0.1转换成二进制,成了二进制的无限循环小数了。电脑不能存储无限循环小数,只能存储一个近似的值,这就是小数在程序的运算中不能精确的原因。

    35e55c620d2a3c2d7aac1a5fd9c263b8.png

    好吧,有兴趣可以算一下十进制0.2、0.3转换成二进制数是怎样的。

    难道十进制的小数转换成二进制数,都变成了无限循环小数吗?不,不是的,也有例外的,也有一些十进制的小数会转换成二进制的有限小数。十进制的0.5转换成二进制数就是0.1,十进制的0.25转换成二进制就是0.01,十进制的0.75转换成二进制数就是0.11

    下列程序代码运行的结果,你是否猜到?

    0.5+0.25==0.75

    运行结果:True

    True和False是程序运算的两个布尔值。关于布尔值运算后续再探讨。

    转了一大圈,还是回到原题吧。如果我们需要最终结果还是整型数据输出,我们可以使用int函数,对变量的数据类型进行转换。
    i=6j=9i=i*jj=i/ji=i/jprint("i=",int(i),"j=",int(j))

    int(i) 将变量 i 的数据转换成整型数据;int(j) 将变量 j 的数据转换成整型数据。运行结果相当完美!i=9 j=6 两个变量数据成功互换。

    两个变量数据互换,还可以用Python的位运算来实现。

    什么是位运算?如何来实现呢?且听下回分解。

    展开全文
  • Verilog - 二进制数转换成BCD编码

    万次阅读 多人点赞 2015-12-16 12:06:12
    二进制和BCD编码都是什么?这里所说的二进制,就是一个变量(整数)的实际值的意思,比如一个整数10,那么我们说他的二进制的值就是10,这个没啥好说的。 主要是BCD编码,在数据的传输中,数据都是以字节(byte)为...

    二进制和BCD编码都是什么?

    这里所说的二进制,就是一个变量(整数)的实际值的意思,比如一个整数10,那么我们说他的二进制的值就是10,这个没啥好说的。
    主要是BCD编码,在数据的传输中,数据都是以字节(byte)为单位进行的传输,一个字节有8个位(bit),那么一个字节能够传递的数值的范围就是0~255(十六进制为0x00~0xFF)。这个时候,比如我们要传递一个值35,那么用十六进制表示就是0x23。一般情况下是没有问题的,但是在某些应用中就存在一定的问题,比如数码管显示上经常需要将数值的每个位都提取出来,还是刚才的值35,在数码管显示的特定应用中就需要将十位3和个位5分别提取,形成一个新的数据0x35,这样用分别独立的数字来表示二进制值的编码方式就是BCD编码。简单来说可以由下图表示:

    这里写图片描述

    Verilog算法

    这里,查看英文原文。
    这里我们采用一种移位加3的算法来实现这个二进制到BCD转换的功能。(当然如果数据范围比较小的情况下,比如几百个数字,我还是推荐在FPGA中使用查找表的方法来进行)

    算法:步骤

    1. 如果某一权位(百位,十位,个位)大于或者等于5,那么此权位加3。
    2. 将二进制数,左移1位到BCD移位寄存器中。
    3. 如果二进制数据位都移动完毕,计算结束
    4. 返回步骤1

    图表表示:
    这里写图片描述

    代码

    这里写图片描述

    展开全文
  • 下面我们来学习二进制特有的运算(计算机特有的运算)什么是移位运算?移位运算指的:将二进制数值的各位数进行左右移位(shift=移位)的运算。①左移:向高位方向②右移:向低位方向案例图示意思变量a...
    这一讲重点讲清楚2个知识点1、弄清移位运算和乘除运算的关系 十进制的运算,我们都很熟悉了,那么二进制的运算机制是怎样的呢? 其实,四则运算同样也可以使用在二进制中,要注意每逢2进一位即可。 下面我们来学习二进制特有的运算(计算机特有的运算)什么是移位运算?移位运算指的是:将二进制数值的各位数进行左右移位(shift=移位)的运算。①左移:向高位方向②右移:向低位方向案例0e0e6c89cef3f75c217e70c639214ae6.png 图示意思:变量a保存十进制39,将左移两位后的结果保存在变量b中。对于计算机来说,无论移动的是十进制或者十六进制等,在底层都是转换成二进制来操作的。上面的案例转换成二进制后移位(左移2位)操作如下 ddb4cf4eee9736218bf7cc1d2bf9bebd.png对上图的说明:无论左移还是右移,溢出的最高位或者最低位直接舍弃。左移空出的最低位用0补,右移空出的最高位后面讲解。规律:十进制左移后会变成原来的10倍、100倍、1000倍。。。同样的,对于二进制来说,左移后变成原来的2倍、4倍、8倍。。。。反之,右移后变成原来的1/2  1/4   1/8等,这从侧面也能反映出移位运算能代替除法运算了。 2、补数补数概念是为了解决计算机中负数的表示方式那么什么是补数?二进制表示负数的原则:最高位作为符号位来表示最高位为0,表示正数最高位为1,表示负数说到这儿可能有些人想,按照上面的原则,-1就表示成10000001,正确答案是11111111计算机在做减法运算时,内部转换成加法运算的,为此,表示负数时要使用到二进制中的补数,补数就是用正数来表示负数。计算机中,一个正数-一个负数=一个正数+这个负数的补数 3、如何获取补数?获取补数的方法:二进制的各数位的数值全部取反,然后将取反后的数加1.如用8位二进制表示-1时,只需求得1的补数即可。1-->0000000100000001取反1111111011111110+1=11111111如下图02815a826756f293d0ae9d8d99fd5321.png补数这种思维方式,直观上可能不容易理解,但是逻辑上是很严谨的。案例1-1=1+(-1)=0如果把-1表示成10000001,运算结果如下。(错误) 1ef708b8ca53eda70242d6eacb76cb6d.png如果把-1表示成11111111,运算结果如下。(正确)  c8e8968153689cbbfb5663ae09dfaf56.png补数求解的变换方式就是取反+1为什么使用补数后就能正确的表示负数呢?看下图c8e8968153689cbbfb5663ae09dfaf56.png运算结果为0结论:将二进制数的值取反后加1的结果和原来的值相加,结果为0注意:当运算的结果为负数时,计算结果也是以补数的形式来表示的。案例(3-5)3--000000115--000001015的补码为11111010+1=11111011-2用补数表示2--000000102取反111111012取反后+111111110 7435721c8190f8201313aca8a4faafff.png 4、这一讲我们讲了移位运算和乘除运算的关系和补数,这些知识点对于一个程序员来说,有时候很重要。明白这些底层机制以后,可以用于代码的优化,提高开发速度等方面。对于非专业人员,了解这些知识可能对你暂时没有用。但是,如果我们学习什么东西都要追求当前有用,那你的视野可能有些狭隘。现在很流行的说法是,跨界学习,我所理解的跨界学习是,不要局限于当下,有时候可以学点无用之学,说不定哪天可以在你的领域内解决大问题呢。 下一讲:逻辑右移和逻辑算术右移的区别
    展开全文
  • .以下代码的输出结果是什么?int X=100;int Y=200;System.out.println("X+Y="+X+Y);...“X+Y=”+X的意思就是把“X+Y=”这个字符串和X这个变量拼接起来组成一个新的字符X+Y=100,而第个中X+Y则是相当...
  • 以下代码的输出结果是什么? int X=100; int Y=200; System.out.println("X+Y="+X+Y); System.out.println(X+Y+"=X+Y"); 为什么会有这样的输出结果? 答:输出的结果为X+Y=100 200 300=X+Y;“X+Y=”+X的意思...
  • 常量与变量什么是常量和变量常量与变量程序在运行时用来存储数据一块内存空间常量:常量的值在程序运行时不能被改变,Java中声明常量必须使用final关键字。常量还可以分为两种意思:第1种意思,就是一个值,这个...
  • C++进制转换

    2012-12-08 22:31:28
    道我们的100,30……是什么意思,它只知道,在某个电 路通电,断电。而我们把通电 称为“1”断电 为“0” ,然后计算机根据 在某个点是否断电 去执行我们需要 的操作。  关于内存。 当我们定义的...
  • java中 ^ 是什么意思

    千次阅读 2019-09-25 13:02:28
    按位异或运算符(^)二元运算符,要化为二进制才能进行计算,在两个操作数中,如果两个相应的位相同,则运算结果为0,否则1;例如: int a=15; int b=a^8; 运算结果为:a=15;b=7; a(二进制)=1111;8(...
  • 程序中,为了更充分的利用内存空间以及更有效率的管理内存,变量是有不同的类型的。一、numbers(数字) int(有符号整型) long(长整型,也可以代表八进制和十六进制) float(浮点型) complex(复数)、布尔...
  • 您不能用普通命令来实现这一点普通命令(shell脚本、python脚本、二进制文件等等)作为主shell进程下的子进程运行,并且不能影响主shell进程的环境。但是shell支持在shell中“发生”的一些类似命令的事情:函数和...
  • java中int和double有什么区别区别如下:1、int数据类型32位,double数据类型64位;...int类型int 数据类型32位、有符号的以二进制补码表示的整数;最小值 -2,147,483,648(-2^31);最大值 2,147,483,64...
  • 在PHP中,经常会遇见%s与%d,本篇将介绍%s与%d是什么意思?PHP sprintf() 函数用到的参数printf — 输出格式化字符串sprintf() 函数把格式化的字符串写入一个变量中。%% - 返回百分比符号%b - 二进制数%c - 依照 ...
  • printf — 输出格式化字符串 ...%b - 二进制数 %c - 依照 ASCII 值的字符 %d - 带符号十进制数 %e - 可续计数法(比如 1.5e+3) %u - 无符号十进制数 %f - 浮点数(local settings aware) %F - 浮点数(n...
  • (&,|)和(and,or)用来比较两组变量的,格式基本上:a & ba | ba and ba or b如果a,b数值变量, 则&, |表示位运算, and,or则依据是否非0来决定输出,&, |:# 1&2,2在二进制里面10,1在二进制01...
  • package Chapter_02; import java.util.Random; public class Control_12 { ...提问:for循环是什么意思 if (((1 ) & i) != 0) 这是什么意思???????????????????????????
  • printf—输出格式化字符串 ...%% - 返回百分比符号%b - 二进制数%c - 依照 ASCII 值的字符%d - 带符号十进制数%e - 可续计数法(比如 1.5e+3)%u - 无符号十进制数%f - 浮点数(local settings aware)%F - 浮点...
  • binbinary的缩写,意思是存放二进制可执行文件的目录,比如exe,msi等,而npm,yarn全局安装的命令就会从这里面开始查找可执行文件。 那为什么系统会从这个路径下进行查找可执行文件呢?这就要说下环境变量。 简单...
  • C++:如果变量不赋初始值……

    千次阅读 2019-07-08 16:58:53
    结果会随机的吗? 还是说和具体的机器有关系? 比如: #include <...转成二进制看看:101111,好像有那么一点意思10 1111默认初始值吗? 或许这一点值得探究一下? (尝试在其他机器,...
  • 我们来查看下npm和yarn的bin目录binbinary的缩写,意思是存放二进制可执行文件的目录,比如exe,msi等,而npm,yarn全局安装的命令就会从这里面开始查找可执行文件。那为什么系统会从这个路径下进行查找...
  • if else优化

    2020-04-18 13:56:42
    但是如果A是二进制变量的集合,或者包含着更大的变量,出现问题的机会就可能会出乎意料的大,且难以理解、测试和维护。 避免if/else if,只使用if语句,花时间确保if组的输入条件互斥的,这样答案就不依赖于执行...
  • ABI应用程序二进制接口的简称,用于标识处理器的工作模式及规范目标文件的编码格式。 MIPS指令集架构自MIPS3起正式支持64位工作模式,故编码可以遵从o32(o意思是old)、n32(n意思是new)与n64等ABI。 o32...
  • 郝斌 C语言笔记(未完毕)

    千次阅读 2015-11-07 16:47:12
    1.变量的本质就是内存中一段存储空间 2.变量什么初始化?... 整数以补码的形式转化为二进制代码,实数以IEEE754标准转化为二进制代码的形式。 5.字符的存储方式和整数一样。 6.ASCII一种规定,规定了不同的
  • Java数据类型与运算符

    2021-04-10 13:42:09
    变量和类型 变量指的程序运行时的可变的量,相当于开辟一块内存来...我们认为 8 个二进制位(bit) 为一个字节(Byte).我们平时的计算机为 8GB 内存, 意思是 8G 个字节.其中 1KB = 1024 Byte, 1MB = 1024 KB, 1GB .
  • 0,1数值,是二进制位; ABCDE符号,可以作为变量。 如果不懂,可以继续看下面的伪代码: vA=""; vB=""; vC=""; vD=""; vE=""; 这几个变量代表什么意思?它们之间有什么关系? 这5个变量,...
  • 字符串编码

    2016-09-05 23:57:04
    双引号中的字符串除了解析变量以外还解析哪些字符?字符串与其他类型是如何转换的?...“二进制安全“是什么意思?字符编码方式什么是位?什么是字节?什么是ASCII编码,如何编码?什么是Unicode编码?如何在XML
  • long型转成bytes

    千次阅读 2015-03-25 16:58:48
    今天刚好有人问VB的Long转换成Bytes,问下面代码是什么意思 Bytes = (Number And &H7F000000) \ &H1000000 Or (((Number And &H80000000) 实际上各种语言计算位的方式都是基本一致的。要理解这些什么意思,关键...

空空如也

空空如也

1 2 3 4 5
收藏数 92
精华内容 36
关键字:

二进制变量是什么意思