-
2021-03-05 20:06:34
如果协议是自己定的话
可以用 ASCII 码的方式来拟定,最大的 127 就够了,也就是说 1 个字节的数值来存储一个字节的字符。
然后从头到尾的扫描进来,每八个二进制数(一个字节)换成一个 char 累加到 string 就 K.O. 了,我也上一份代码:
/**
* 从二进制到字符串
*
* @param todo
* 要处理的二进制字符串
* @return 分析后的字符串
*/
public static String getString(String todo) {
// [Neo] 只过滤了 空格和逗号,其他字符自己处理吧
String bin = todo.trim().replace(" ", "").replace(",", "");
String str = "";
for (int i = 0; i < bin.length(); i += 8) {
try {
str += (char) Integer.valueOf(bin.substring(i, i + 8), 2)
.intValue();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
return str;
}
调用的实例:
String todo = "0100 1110, 0110 0101, 0110 1111";
System.out.println("getString: " + getString(todo));
我的输出结果是: Neo
祝好,
斑驳敬上
更多相关内容 -
HashMap-二进制&计算下标方法刨析
2019-09-15 11:36:011、HashMap计算下标的方法 计算下标源码 Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - ...1、HashMap计算下标的方法
计算下标源码
Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null);
源码中n为数组长度,i为插入位置下标
第四行 tab[i = (n - 1) & hash] 得知 下标 = 数组长度-1 位与 hash
值2、为什么做 & 操作
2.1、假如用十进制思想实现
我们思考数学计算的方式通常以十进制思想,我们先按通常人思路讲解,随后再引出为什么HashMap用 & 计算。
假如HashMap创建长度为16的数组(默认创建方式长度确实为16,稍后详细介绍),hash值为32位以内任意数
32位int范围为-2147483648 - 2147483647,将如此庞大的数据范围散列的存放在长度为16的数组中,我们想到的是取余。
例
14%16 = 14 14存放在14下标位
18%16 = 2 18存放在2下标位
32%16 = 0 32存放在0下标位
当然在HashMap中还存在碰撞解决,再此不做讨论
十进制的思想告诉我们,想要将hash值均匀的分布在固定大小的数组中,要用到取余计算下标2.2、更加效率的&运算
我们知道计算机底层是二进制运算,直接用二进制&计算去模拟取余操作,能够增加计算效率
2.3、取余 与 位与(&) 运算之间的关联
上面我们提到 下标 = 数组长度-1 位与 hash值
而创建HashMap的数组长度为2n,假设数组长度=16,hash=10016-1 的二进制 1111
100 的二进制 1100100
两者做&运算
0001111
&
1100100
我们可以发现由于0001111高位为0
事实上就是
1111
&
0100
取余结果为100(二进制)= 4,由于100%16=4,结果与取余结果相同我们可以看到利用&运算时,hash值高位数据不参与运算,低位数据便是取余结果
为什么会这样呢???
首先回顾一下将二进制转换十进制
11111111 转换为十进制 128+64+32+16+8+4+2+1 = 255,二进制的1从高位到低位分别代表 128、64、32、16、8、4、2、1
每一位代表的数 = 前面所有位代表数的合 + 1;2 = 1+1
4 = 2+1+1
8 = 4+2+1+1
16 = 8+4+2+1+1
、、、我们再回过头看HashMap中计算下标的算法,i = (n-1) & hash,在n值为2的k次幂条件下。hash值高于n-1的位无论是1或0都是n的倍数,而低于n-1的位本身便是余数
假如n(数组长度)不为2的k次幂,以上结论不成立2.4、假如不为2的k次幂
刚刚一直强调数组长度为2的k次幂,假如不符合这特定条件会怎样
计算(2的k次幂-1)的二进制2-1 = 1
4-1 = 11
8-1 = 111
16-1 = 1111
32-1 = 11111可以看出符合特定条件的n-1所有位都为1
前面也介绍了技术下标算法是hash的低位与n-1做&运算
假设hash = 0101或hash = 0100,计算两种情况的结果例一
1111
&
0101
等于 0101例二
1111
&
0100
等于 0100例三
1100
&
0101
等于 0100例四
1100
&
0100
等于 0100可以看出例三例四hash值不同但结果相同,n-1二进制全是1的情况下做&运算更有辨识度,更能有效将数据散列开
3、总结
1、用二进制&运算完全可以替代取余运算并且这么做是为了提高计算机运算效率
2、只有限定数组长度为2的k次幂才能用&运算模拟取余运算
3、通过对n-1 &运算 辨识度分析,反向推论出取余是最好的散列手段,避免造成数据堆积 -
java获取整数二进制指定位数的值和给指定位数设置0或1(以及实际中的应用)
2021-02-27 21:49:53公司项目中领导要求数据库的一个字段用int类型的二进制表示多种状态 每个下标对应不同的状态,1表示正常0表示不正常 如7的二进制是111,则表示三个状态都正常6的二进制110表示第一个不正常,第二第三个都正常. 要查询第...公司项目中领导要求数据库的一个字段用int类型的二进制表示多种状态
每个下标对应不同的状态,1表示正常0表示不正常
如7的二进制是111,则表示三个状态都正常6的二进制110表示第一个不正常,第二第三个都正常.
要查询第二个状态是正常的,直接sql也能查出.
如要查出第3位是正常所有记录select * from tableName where (column >> (3-1)) & 1 = 1;
这个样表示的好处就是便于以后扩展,以后的状态有增减不用修改数据库.
package com.base; /** * @Authro: QYF * @Time:2021/2/26 21:38 */ public class BinaryDemo { public static void main(String[] args) { //整数 int num = 18; //转成二进制 String binary = Integer.toString(num, 2); //从低位算,获取第几位是否为1 int index = 2; boolean flag = getStatusType(num, index); System.out.println(num + "的二进制为:" + binary + ",二进制第:" + index + "位为:" + (flag ? 1 : 0)); //状态 int status = 0; int result = updateStatusType(num, index, status); System.out.println(num + "的二进制为:" + binary + ",把第" + index + "位改成" + status); System.out.println(result + "的二进制为:" + Integer.toString(result, 2)); } /** * 判断第几位是否为1 * <p> * 如18的二进制为10010,要获取第3位,则右移(3-1)位得100,第2位变成第1位,这样就可以和&1,最低位为1返回1,为0则返回0 * * @param num 整数 * @param index 低位起第几位下标 * @return */ private static boolean getStatusType(int num, int index) { return (num >> (index - 1) & 1) == 1; } /** * @param num 整数 * @param index 低位起第几位下标 * @param status 要修改的状态 * @return */ private static int updateStatusType(int num, int index, int status) { if (status != 0 && status != 1) { throw new IllegalArgumentException(); } if (status == 1) { //1向左移(index-1) 和10010 或 return (1 << (index - 1)) | num; } else { //先判断原来是不是0,原来是0则直接返回 if (!getStatusType(num,index)){ return num; } //10010 - 1向左移(index-1) return num - (1 << (index - 1)); } } }
输出结果:
18的二进制为:10010,二进制第:2位为:1 18的二进制为:10010,把第2位改成0 16的二进制为:10000
-
获取二进制数中某一位的值
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 ...题目描述
获取数字 num 二进制形式第 bit 位的值。注意:
1、bit 从 1 开始
2、返回 0 或 1
3、举例:2 的二进制为 10,第 1 位为 0,第 2 位为 1示例1
输入
128, 8
输出
1
我的解答:
function valueAtBit(num, bit) {
var str=num.toString(2);
return str[str.length-bit];}
利用toString()函数,将数字转化为了二进制字符串,然后字符串长度和位的关系将其取出
其他解答:
function
valueAtBit(num, bit) {
return
(num >> (bit -1)) & 1;
}
利用了移位操作,之前没有接触过这种解法,理解之后感觉相当简洁
以上面的示例分析,128,8-》1;
128->1000 0000;要想将第八位上的数字取出,可以将她移到第一位上,也即是向右移动7位变成0000 0001,怎样将第一位上的1拿出来呢,可以利用与操作,让0000 0001,与1(0000 0001)与,除了第一位上的数是它本身,其余位全部变成了0,这样就将第一位取了出来。
自己可以写个二进制数字分析下,如:1000 0000 第八位是1,要想将他移到第一位上,移动的就是bit-1位,之后让它和1与,这样就能将除了第一位之外的其他位上的数字置0,输出的就只有第一位上的数字,也即是我们需要的那个
-
Binary Indexed Tree(二进制索引树、树状数组)
2016-06-06 01:11:58LowBit,即2进制数中从最低位开始连续0的位数的关于2的幂,其值LowBit(x)=x∧-x(x&-x,x and -x)。也就是上文所说的2^k LowBit(x)显然就是not x中最低的是0的那一位,(not x)+1的那一位则会变成1,其更低的位... -
二进制转十进制怎么算?二进制转十进制公式及方法!
2021-07-30 02:46:56二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。二进制数据也是采用位置计数法,其位权是以2为底的幂。二进制转换十... -
bcd码和二进制码有什么区别
2021-07-26 01:06:10描述二进制是由1和0两个数字组成的,它可以表示两种状态,即开和关。所有输入电脑的任何信息最终都要转化为二进制。目前通用的是ASCII码。最基本的单位为bit。二进制编码是用预先规定的方法将文字、数字或其他对象编... -
二进制如何转换为十进制?
2021-06-19 05:54:00二进制到十进制数字转换使用加权列来标识数字的顺序以确定数字的最终值将二进制转换为十进制(base-2到base-10) )数字和背面是一个重要的概念,因为二进制编号系统构成了所有计算机和数字系统的基础。十进制或... -
进制转换(二进制与十、八、十六进制的转换)
2021-01-18 12:52:31二进制:0、1 八进制:0 ~ 7 十进制:0 ~ 9 十六进制:0 ~ 9 ,a,b,c,d,e,f (a ~ f:10,11,12,13,14,15) 进制转换 十转二 D → B 12 → 1100 二转十 B → D 1100 → 12 1 * 23 ... -
详解C++中二进制求补运算符与下标运算符的用法
2021-01-20 05:48:20二进制求补运算符:~ 语法 ~ cast-expression 备注 二进制反码运算符 (~)(有时称为“按位反码”运算符)将生成其操作数的按位二进制反码。即,操作数中为 1 的每个位在结果中为 0。相反,操作数中为 0 的每个位... -
二进制、八进制、十进制、十六进制的英文及简写
2022-02-08 19:31:30二进制Binary 简写为B 八进制Octal 简写为O 十进制Decimal 简写为D 十六进制Hexadecimal 简写为H -
二进制转换十进制 算法解析
2021-03-06 16:26:56java里面是有进制间互换现成的方法的:public class十进制与各进制的相互转换 {public static voidmain(String[] args){//java已经实现的机制:十进制转换为二进制int decimal = 10;System.out.println("十进制数:"+... -
pgsql数据类型:二进制字符串
2020-08-19 21:17:09二进制字符串 名字 存储尺寸 描述 bytea 1或4字节外加真正的二进制串 变长二进制串 db=# create table demo_bytea(bytea bytea); 插入 插入文本 db=# insert into demo_bytea values('123'); INSERT 0 1 ... -
二进制和十六进制
2018-08-16 08:40:17不管用什么高级语言编写的程序最后都要转换为二进制语言,才能在计算机上执行,因此掌握二进制知识对学习编程语言是非常有帮助的。本篇和同学们探讨二进制计数原理以及与十进制、十六进制的转换。通过本篇的学习,你... -
及二进制的基本运算规则,还有.二进制数据与十进制、八进制、十六进制数据之间的转换方法?
2021-07-20 02:00:48满意答案sqq2125272013.04.11采纳率:46%等级:12已帮助:10556人编辑本段简介 20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,其运算模式正是二进制,同时证明了莱布尼兹的原理是正确的。... -
计算机基础二进制.ppt
2021-06-26 09:08:56计算机基础二进制.ppt (23页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分内容:基本制作制作人:时宽飞数学建模协会PPT制作交流Date1计算机基础教程超链接... -
趣味数学计算机中数据的存储二进制
2021-07-25 01:29:31《趣味数学计算机中数据的存储二进制》由会员分享,可在线阅读,更多相关《趣味数学计算机中数据的存储二进制(29页珍藏版)》请在人人文库网上搜索。1、计算机中的数学,计算机中数据的表示,众所周知,所有的数据在... -
C语言十进制转二进制代码实例
2021-05-22 15:39:56C语言十进制转二进制代码实例用C语言实现将十进制转化为二进制,并统计转换后的二进制码中1的个数。#include int binaryNum[16]; //存放转换后得到的二进制码int count=0; //计数十进制整数被2除的次数int oneCount=... -
二进制(标识B)十进制.ppt
2021-07-25 07:55:44二进制(标识B)十进制.ppt计算机中数据的表示 十进制 - Decimal 由十个符号组成 逢十进一 ...十六进制 – Hex 由十六个符号组成:0-9 A-F 逢十六进一 简化书写,和二进制转化方便 不同数制的常见书写方法 下标法: (1... -
进制的概念与转换(二进制、十进制、八进制、十六进制)
2020-05-31 16:35:23众所周知,计算机中使用的是二进制运算规则,能够读懂二进制语言,但究竟什么是进制?进制之间是如何相互转化的?今天我们就来详细了解下。 -
数值转换二进制、八进制、十进制、十六进制
2022-01-05 14:43:21对不同的数制,可以给数字加上括号,使用下标来表示该数字的数制(当没有下标时默认为十进制)如:(1010)2、123、(2A4E)16,分别代表不同数制的数。 除了用下标表示外,还可以用后缀字母来表示数制,两者的意义相同。 -
Python算法学习:全排列的回溯实现与二进制枚举
2020-03-01 15:13:25二进制下标 4 3 2 1 0 二进制 1 1 0 0 1 小球状态 存在 存在 不存在 不存在 存在 我们可以用5个比特位来表示这种情况,如果小球全部选择的话那么二进制表示就是11111,二进制的11111转化为十进制数字就是31,这个数字... -
二进制基础及位运算
2019-12-04 16:06:09二进制计算 每一位上的数基数的索引次幂相加之和 例如:0101=12º+12²=5 第一位1基数2的索引0次幂+第三位1*基数2的2次幂等于5 其他进制计算等同 十进制转2进制:除2求余法 除2求余倒序表示 简便算法:记住2的10次... -
十进制转换二进制
2019-02-28 22:27:42十进制转换二进制 顺序压入,倒序输出(数组下标 --) int b[MAX]; int s = 0; while (c != 0) { b[s] = c % 2; c /= 2; s ++; } while (--s >= 0) printf("%d", b[s]); printf("\n&... -
C语言二进制、八进制、十六进制整数书写和输出
2021-05-19 10:55:42整数是我们生活中常用的数据类型,也是编程中常用的一种数据,C语言用int关键字来...unsigned:无符号的,只能表示正数,例如数组的下标、人的身高等。short:短的,现在主流的64位操作系统下,整数占用内存4个字节... -
java实现文件转换成二进制存储与取出
2021-02-12 21:05:13二.分类 a. Using filesort : 说明mysql 会对数据使用一个外部的索引排序,而不是按照表内的索引顺序排序进行读取的.mys ... 使用Docker方式创建3节点的Etcd集群 一.简要说明 二.运行容器 三.验证集群 四.运行截图 ... -
跟我学java编程—不得不说的二进制和十六进制
2021-02-28 12:23:11计算机能够识别的数制是二进制数,二进制数是用0和1两个数字来表示的数,计算机的指令集也是采用二进制表示,机器语言就是用二进制数编写程序。可以借助十进制数来理解二进制数。在十进制中,每一位有0、1、2、3、4... -
在Java中将字符串(如testing123)转换为二进制文件
2021-03-16 16:40:37青春有我通常的方法是用于String#getBytes()获取基础字节,然后以其他某种形式(十六进制,二进制形式)显示这些字节。请注意,它getBytes()使用默认字符集,因此,如果要将字符串转换为某些特定的字符编码,则应... -
JavaScript存储与操作二进制数据
2022-01-24 11:21:17于是写这篇的目的就是为了加固对二进制数据的理解,以及JavaScript中如何操作二进制数据的。 ArrayBuffer 其他语言java,易所表示的是字节数组,字节集,而在js中则称二进制数组(都是用来表示二进制数据的),要...