精华内容
下载资源
问答
  • erlang 二进制语法(bit syntax)

    千次阅读 多人点赞 2013-09-11 20:28:16
    Erlang的比特语法(erlang bit syntax)提供了种方法来匹配二进制数据,这使得Erlang二进制对象在某种程度上等同于其他Erlang对象,如元组和列表。也因为其快速高效,使得在erlang中,二进制对象被广泛使用,尤其...

    Erlang的位语法(Erlang Bit Syntax)提供了一种方法来表示和匹配二进制数据,这使得Erlang二进制对象在某种程度上等同于其他Erlang对象,如元组和列表。也因为其快速高效,使得在Erlang中,二进制对象被广泛使用,尤其是在协议编程方面。(官方文档


    位语法/比特语法(bit syntax)

    Erlang的位语法表达式,即Erlang二进制的表示形式:

    <<>> 
    <<E1,...,En>>

    每个元素Ei指定了一段二进制串(bit string)。每个元素Ei都是一个值,后面可以带有可选参数Size、TypeSpecifierList,如下:

    Ei = Value |
         Value:Size |
        Value/TypeSpecifierList |
        Value:Size/TypeSpecifierList

    Size表示前一个Value数据存储的位数,默认是8位,也就是一个字节。

    TypeSpecifierList可以是以下几种类型及其组合,组合以 - 相连

    Type = integer | float | binary | bytes |bitstring | bits | utf8 | utf16 | utf32

           默认值是integer。bytes是binary的简写,bits是bitsring的简写

    Signedness = signed | unsigned

           只有当type为integer时有用,默认是unsigned

    Endianness = big | little | native

           当type为integer,utf16,utf32,float有用,默认是big

    Unit = unit:IntegerLiteral

           有效范围是1-256,integer、float和bitstring默认是1,binary默认是8

    例如:

    -define( UINT, 32/unsigned-little-integer).
    -define( INT, 32/signed-little-integer).
    -define( USHORT, 16/unsigned-little-integer).
    -define( SHORT, 16/signed-little-integer).
    -define( UBYTE, 8/unsigned-little-integer).
    -define( BYTE, 8/signed-little-integer).
    -define( CHAR, 1/binary-unit:8).
    

    不同的bit syntax生成的二进制是不同的,如下:

    2> <<111:16/signed-big-integer>>.
    <<0,111>>
    3> <<111:16/signed-little-integer>>.
    <<111,0>>
    

    下面以官方文档的一段代码,辅助理解下:

    1> Bin1 = <<1,17,42>>.
    <<1,17,42>>
    2> Bin2 = <<"abc">>.
    <<97,98,99>>
    3> Bin3 = <<1,17,42:16>>.
    <<1,17,0,42>>
    4> <<A,B,C:16>> = <<1,17,42:16>>.
    <<1,17,0,42>>
    5> C.
    42
    6> <<D:16,E,F>> = <<1,17,42:16>>.
    <<1,17,0,42>>
    7> D.
    273
    8> F.
    42
    9> <<G,H/binary>> = <<1,17,42:16>>.
    <<1,17,0,42>>
    10> H.
    <<17,0,42>>
    11> <<G,H/bitstring>> = <<1,17,42:12>>.
    <<1,17,2,10:4>>
    12> H.
    <<17,2,10:4>>
    

     

    例子说明:

    1、例子1和2:从一组常量或一个字符串来构造二进制对象

    1> Bin1 = <<1,17,42>>.
    <<1,17,42>>
    2> Bin2 = <<"abc">>.
    <<97,98,99>>
    

    以上表示的二进制大小都是3字节(1+1+1)。

    字符串"abc"转化成latin1码也就是 97,98,99,然后二进制默认用8位记录,所以结果就是<<97,98,99>>。

     

    2、例子3:从一组限定边界的变量来构造二进制对象

    3> Bin3 = <<1,17,42:16>>.
    <<1,17,0,42>>
    

    以上表示的二进制大小为4字节(1+1+2)。

    上面,我们给42指定了16位(2个字节)的大小来记录,所以在内存中的数据为0000 0000 0010 1010,而Erlang二进制的默认表示,以1个字节(8位)为单位分割数据。

    所以<<42:16>> 构成的二进制也就是<<0:8, 42:8>>  ,然后,8是默认值可以不显示,也就是<<0, 42>>


    3、例子4、6:按照某种形式匹配二进制对象

    4> <<A,B,C:16>> = <<1,17,42:16>>.
    <<1,17,0,42>>
    6> <<D:16,E,F>> = <<1,17,42:16>>.
    <<1,17,0,42>>

    例子4很好理解,这里说一下例子6吧,为何D会得到273的结果?

    <<1,17,42:16>>生成的二进制数据前面说过了,为<<1,17,0,42>>

    D:16表示匹配<<1,17,42:16>>前面16位的数据 <<1:8, 17:8>>,所以得到就是<<1,17>> 

    然后, <<1,17>>在内存中表示为0000 0001 0001 0001,结果就是256 + 16 + 1,也就是273,这就得到了D的值


    4、例子11:也是从一组限定边界的变量来构造二进制对象,和例子3不同的是大小不是8的倍数。

    <<1,17,42:12>>.
    

    上面,我们给42指定了12位的大小来存储,所以在内存中的数据为0000 0010 1010,

    这样构造出来的对象就是<<2,10:4>>

    在erlang 二进制中,对象默认以8位为一个单位来表示,不足就向后面借位,比如:<<42:12,1,17>>生成的二进制对象是<<2,160,17,1:4>>,其实两者表达的是一段相同的二进制数据。


    注意:

     "B=<<1>>" 在erlang中被解释成 "B =< <1>>",这会引起一个语法错误“syntax error before: '<'”。正确的做法是写成 "B = <<1>>" 


    binary与bitstring的区别?

    erlang文档有说明:

    A bitstring is a sequence of zero or more bits, where the number of bits does not need to be divisible by 8. If the number of bits is divisible by 8, the bitstring is also a binary.

    就是说,binary也是bitstring的一种,当二进制串大小能被8整除,就是binary


    什么情况下会区分?

    如模式匹配:

    foo(<<A:8,Rest/binary>>) ->
    	{binary, A, Rest};
    foo(<<A:8,Rest/bitstring>>) ->
    	{bitstring, A, Rest}.


    2016/3/7 补充对二进制的解释,原标题名《erlang 位语法/比特语法(bit syntax)》

    2015/7/17 补充binary与bitstring的区别

    参考:http://blog.csdn.net/mycwq/article/details/11529755

    展开全文
  • 一字节是八个二进制位。 字节(Byte)是计算机...一位16进制数(用二进制表示是xxxx)最多只表示到15(即对应16进制的F),要表示到255,就还需要第二位。所以1个字节=2个16进制字符,一个16进制位=0.5个字节。 ...

    一字节是八个二进制位。
    字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。 数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit)。

    位:英文bit,音译为“比特”,表示二进制位。 位是计算机内部数据储存的最小单位,11010100是一个8位二进制数。一个二进制位只可以表示0和1两种状态(21);两个

    比特是表示信息的最小单位,是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量。 一个字节(byte)为8个比特,一个英文字母通常占用一个字节,一个汉字通常占用两个字节。普通计算机系统能读取和定位到最小信息单位是字节(byte)。

    1个字节是8位,二进制8位:xxxxxxxx 范围从00000000-11111111,表示0到255。一位16进制数(用二进制表示是xxxx)最多只表示到15(即对应16进制的F),要表示到255,就还需要第二位。所以1个字节=2个16进制字符,一个16进制位=0.5个字节。

    例:算出2的平方根的前32bit。
    在这里插入图片描述

    在这里插入图片描述
    32bit = 4byte = 16进制值/2

    得出结果:0x6a09e667

    展开全文
  • 计算二进制数中有多少位是 1

    千次阅读 2013-04-09 15:40:28
    #include ...//计算一个二进制数中有多少位是 1 //一个字节占八位,第一位肯定是 1 //所以 只需要检验后面七位是否有 1 //因此 宏 定义 一个 BIT7 为 0x1 //专业术语 就是最高位置1 **************

    #include<iostream>
    using namespace std;
    /***********************************************
    //计算一个二进制数中有多少位是 1
    //一个字节占八位,第一位肯定是 1
    //所以 只需要检验后面七位是否有 1
    //因此 宏 定义 一个 BIT7 为 0x1 <<7 实际上就是 1000 0000
    //专业术语 就是最高位置1
    ***********************************************/

    #define BIT7 (0x1 << 7)  //一个字节 是八位 那么
    int calculate(unsigned char c)
    {
     int count =0;
     int i;
     unsigned char comp = BIT7;
     //sizeof( c )  == 1
     for(i = 0 ; i<sizeof(c) * 8; i++)
     {
      if( (c & comp) != 0)
      {
       count++;
      }
      comp = comp>>1; //每右移一次 就是检测 从左至右的下一位是否为 1

     }
     return count;
    }
    int main()
    {
     unsigned char c = 0;
     int count =0;
     printf("c=");
     scanf("%d",&c);
     count = calculate(c);
     printf("count = %d\n",count);
     return 0;
    }

    展开全文
  • #include<...#define BIT31 (0x1<<31) int calculate(unsigned int c) { int count = 0; int i = 0; unsigned int comp = BIT31; for (i = 0; i < sizeof(c) * 32; i++) { if (...
    #include<stdio.h>
    #define BIT31 (0x1<<31)       
    
    int calculate(unsigned int c)
    {
    	int count = 0;
    	int i = 0;
    	unsigned int comp = BIT31;
    	for (i = 0; i < sizeof(c) * 32; i++)
    	{
    		if ((c&comp) != 0)
    			count++;
    		comp = comp >> 1;
    	}
    	return count;
    }
    
    int main()
    {
    	unsigned int c = 0;
    	int count = 0;
    	printf("c=");
    	scanf_s("%d", &c);
    	count = calculate(c);
    	printf("count=%d\n", count);
        return 0;
    }
    

    首先

    0x表示此数为16进制表示方法
    0x1表示为2进制就是0001
    << 是移位操作
    0x1 << 3表示将0x1向左移3位
    左移3位相当于乘以2^3=8
    即0x1 << 3 = 0001 << 3 = 1000 = 0x8
    这里左移31位得到的二进制是1000,0000,0000,0000,0000,0000,0000,0000即0x80000000

    因为
    unsigned int是32位的,用BIT31去做&运算,且不断右移,就可以得出每位是否是1,并用count计数

    熟悉二进制表达的话,用几个数检验就发现是对的。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 将m的二进制插入到n进制的第j到第i二进制的位数从低位到高位,且从0开始。 以下是代码 class BinInsert { public: int binInsert(int n, int m, int j, int i) { int k=n; int o=j; while(i>0) { ...
  • 二进制不同位数

    2017-03-11 08:54:02
    世界上有10种人,种懂...那么你知道两个int32整数m和n的二进制表达,有多少(bit)不同么?  对于这道题目,我的想法是首先把对应的十进制整数转换为二进制,然后对比两个二进制,得出结果。 至于用什么来存储er'j
  • // 判断个整数的二进制位中有多少个1void totalOne(int x){ int count = 0; while(x) { x = x & ( x - 1 ); count++; } printf("count = %d/n", count);}循环: x = x & ( x - 1 ); count++; 直到x为0为止。该...
  • 那么你知道两个int32整数m和n的二进制表达,有多少(bit)不同么?输入例子:1999 2299输出例子:7public class Solution { /** * 获得两个整形二进制表达位数不同的数量 * * @param m 整数m * @param n 整数n...
  • 解法:举例说明,为了减少复杂度,就使用八位二进制吧。设 A = 0010 1011, B = 0110 0101. 1. C = A & B = 0010 0001; 2. D = A | B = 0110 1111; 3. E = C ^ D = 0100 1110;//异或运算 4. 结果E中有4个1...
  • C++快速判断二进制是1或0

    万次阅读 2017-09-11 09:15:17
    C++快速判断二进制是1或0
  • Python读字节某一位的值,设置某一位的值,二进制位操作   在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把0和1、True和False、Yes和No...
  • 获取二进制数中某一位的值

    万次阅读 2018-05-30 11:09:24
    获取数字 num 二进制形式第 bit 的值。注意: 1、bit 从 1 开始 2、返回 0 或 1 3、举例:2 的二进制为 10,第 1 为 0,第 2 为 1 示例1 输入 复制 128, 8 输出 复制 1 我的解答: function ...
  • 首先要知道这个数的二进制转化,要实现从左到右的翻转,要么让二进制数从后往前移位,要么就是从后往前读每一位都乘以2^(32-i),最后相加就行了。 举例说明吧: 如在32位机器上15这个值包含下列各位: ...
  • golang二进制字节的常用操作

    千次阅读 2018-08-24 21:34:36
    golang作为热门的兼顾性能 效率的热门语言,相信很多人都知道,在编程语言排行榜上一直都是很亮眼,作为一门强类型语言,二进制位的操作肯定是避免不了的,数据的最小的单位也就是,尤其是网络中封包、拆包,...
  • 要求个数对应二进制最低为1对应的数字lowbit,如lowbit(5),5的二进制位101,对应的结果就,001即1,lowbit(4),4的二进制位100,对应的结果就,100即4。 由于计算机采用二进制补码作为数学运算,所以可以用x&-x来...
  • 判断个数的二进制数有多少位1

    千次阅读 2020-04-01 15:20:38
    其实这篇文章可以挖的很深,从二进制的本质出发有很多可以考虑的点。但是我并不能理解这么深55555 从题目中的问题出发,我们将十进制转换为二进制的时候使用的是什么方法呢? 将该数跟2取余,再除于2,反复操作,...
  • 个整数的二进制最高

    千次阅读 2011-03-23 13:42:00
    求十进制整数的最高非常简单,那计算机如何求个整数的二进制最高? <br />众所周知,计算是通过01二进制来表示世界的,自然整数也是使用二进制存储在计算机硬盘中。那如何求个整数的二进制最高...
  • 1.//求个数二进制中含有多少个1 //2.获取个数二进制序列中所有的偶数和奇数,分别输出二进制序列 //3.写个程序将个数的二进制表示中奇数和偶数进行交换。 //4.输出二进制左右分别交换后的值
  • 问题描述: Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming ...For example, the 32-bit integer ’11' has binary representa
  • 二进制bit)整数

    千次阅读 2019-06-20 21:54:52
    二进制数(binary number)用 2 个数字作基础,其中每二进制数字(称为bit)不是 0 就是 1。 自右向左,从 0 开始顺序增量编号。左边的称为最高有效(Most Significant Bit, MS...
  • 这是小米2015年暑假实习生第道笔试题,其实...那么你知道两个int32整数m和n的二进制表达,有多少(bit)不同么? 输入例子: 1999 2299 输出例子: 7 */ #include int countBitDiff(int m, int n) { int data=1;
  • 什么是码元(以二进制位来参考)

    千次阅读 2014-09-03 20:39:34
    计算机用语中一个bit就是二进制一位,一个二进制码元就是二进制一位,四进制有两个bit就是指有两个二进制码元,一个码元有两种可能,两个码元就是有四种可能,即也就是二进制的两位,四进制码元也就是一个码元有...
  • 二进制

    2017-01-06 00:13:18
    二进制二进制与十进制的相互转换、比特(元) bit → 字节byte → 字符
  • 什么是深度(bit depth):计算机是以二进制为单位的,采用二进制形式表示数据和指令,计算机里的存储芯片只能识别高低电平(0或1,这里的0和1分别代表低电平、高电平),计算机图形学领域表示在点阵图或者视频帧缓冲区中...
  • 二进制位统计算法(swar)

    千次阅读 2019-04-08 15:31:30
    里面讲到了几种二进制位统计算法,在此做个记录 1. 遍历二进制位 def count_bit(num): count = 0 while num: count += num & 1 num >>= 1 return count 遍历统计需要 ...
  • 那么你知道两个int32整数m和n的二进制表达,有多少(bit)不同么? 输入例子: 1999 2299 输出例子: 7 我的代码: /** * 求两个数的二进制中不同的位数 * @param m * @param n * @return 返回...
  • 首先先要明确计算机是以二进制来进行计算的,...而16进制,是满16进1,而二进制是满2进1,则说明16进制的一个位置是需要二进制的4位才能占满的(16=2^4),则32位对于16进制来说需要8位(每一位二进制的4个位) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 160,556
精华内容 64,222
关键字:

二进制一位是多少bit