精华笔记:
什么是二进制:逢2进1的计数规则。计算机中的变量/常量都是按照2进制来计算的
十六进制:逢16进1的计数规则
补码:--------------------------了解
位运算:---------------------了解
取反:~
与运算:&
或运算:|
右移位运算:>>>
左移位运算:<<
移位运算的数学意义:
什么是二进制:逢2进1的计数规则。计算机中的变量/常量都是按照2进制来计算的
2进制:
如何将2进制转换为10进制:
将二进制每个1位置的权相加即可---------------正数
权: 32 16 8 4 2 1
二进制: 1 0 1 1 0 1
十进制: 32+8+4+1=45
int n = 45; //编译时会被编译为:101101
System.out.println(Integer.toBinaryString(n)); //以2进制输出
System.out.println(n); //以10进制输出
n++; //将101101增1----101110
System.out.println(Integer.toBinaryString(n)); //以2进制输出
System.out.println(n); //以10进制输出
十六进制:逢16进1的计数规则
16进制:
用途:因为2进制书写太麻烦,所以常常用16进制来缩写2进制
如何缩写:将2进制从低位开始,每4位2进制缩为1位16进制
权: 8 4 2 1
2进制: 0001 1011 1010 1010 0101
16进制: 1 b a a 5-----------1baa5
权: 8 4 2 1
2进制: 0010 1111 1101 0100 0111 1011
16进制: 2 f d 4 7 b------2fd47b
权: 8 4 2 1
2进制: 0010 1001 0101 1010 1011 1001
16进制: 2 9 5 a b 9
//演示16进制
int n = 0x2fd47b; //0x表示16进制
int m = 0b0010_1111_1101_0100_0111_1011; //0b表示2进制
System.out.println(Integer.toBinaryString(n)); //按2进制输出
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toHexString(n)); //按16进制输出
System.out.println(Integer.toHexString(m));
System.out.println(n); //按10进制输出
System.out.println(m);
//演示8进制
int a = 067; //以0开头的表示8进制
System.out.println(a); //55(6个8加7个1)
/*
小面试题:-----8进制平时不用
int a = 068; 正确吗?
答:编译错误,因为0开头的表示8进制,最大的数为7
*/
补码:--------------------------了解
计算机处理有符号数(正负数)的一种编码方式
以4位2进制为例讲解补码的编码规则:
规律数:
int max = Integer.MAX_VALUE; //int的最大值
int min = Integer.MIN_VALUE; //int的最小值
System.out.println(Integer.toBinaryString(max)); //01111111...
System.out.println(Integer.toBinaryString(min)); //10000000...
System.out.println(Integer.toBinaryString(-1)); //11111111...
深入理解负值:
记住32位二进制数的-1的编码:32个1
负值:用-1减去0位置对应的权---------------负数
1)11111111111111111111111111111111 = -1
2)11111111111111111111111111111101 = -1-2 = -3
3)11111111111111111111111111111010 = -1-1-4 = -6
4)11111111111111111111111111110111 = -1-8 = -9
5)11111111111111111111111111110101 = -1-2-8 = -11
6)11111111111111111111111111010011 = -1-4-8-32 = -45
//负值的输出
int n = -45;
System.out.println(Integer.toBinaryString(n)); //以2进制输出
int m = -11;
System.out.println(Integer.toBinaryString(m)); //以2进制输出
互补对称现象:-n=~n+1--------取反+1
-7 = 11111111 11111111 11111111 11111001 = -1-2-4=-7
~-7 = 00000000 00000000 00000000 00000110 = 2+4=6
~-7+1 = 00000000 00000000 00000000 00000111 = 1+2+4=7
5 = 00000000 00000000 00000000 00000101 = 1+4=5
~5 = 11111111 11111111 11111111 11111010 = -1-1-4=-6
~5+1 = 11111111 11111111 11111111 11111011 = -1-4=-5
12 = 00000000 00000000 00000000 00001100 = 4+8=12
~12 = 11111111 11111111 11111111 11110011 = -1-4-8=-13
~12+1 = 11111111 11111111 11111111 11110100 = -1-1-2-8=-12
//互补对称现象: -n=~n+1
int n = -7;
int m = ~n+1;
System.out.println(m); //7
int i = 12;
int j = ~i+1;
System.out.println(j); //-12
int a = 2147483647; //int的最大值
a = a+1;
System.out.println(a); //-2147483648(int的最小值)
int b = -2147483648; //int的最小值
b = b-1;
System.out.println(b); //2147483647
位运算:---------------------了解
取反:~
与运算:&
运算规则:逻辑乘法,见0则0
0 & 0 ---------> 0
0 & 1 ---------> 0
1 & 0 ---------> 0
1 & 1 ---------> 1
n = 00010111 01110101 01111010 11110110----0x17757af6
m = 00000000 00000000 00000000 11111111----0xff
k = n&m = 00000000 00000000 00000000 11110110----0xf6
int n = 0x17757af6;
int m = 0xff; //8位掩码
int k = n&m;
System.out.println(Integer.toBinaryString(n));
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(k));
如上运算的意义:k中储的是n的最后8位,这种运算叫做掩码运算
一般从低位开始1的个数称为掩码的位数
或运算:|
运算规则:逻辑加法,见1则1
0 | 0 ----------> 0
0 | 1 ----------> 1
1 | 0 ----------> 1
1 | 1 ----------> 1
n = 00000000 00000000 00000000 11011110 0xde
m = 00000000 00000000 10011101 00000000 0x9d00
k = n|m = 00000000 00000000 10011101 11011110 0x9dde
int n = 0xde;
int m = 0x9d00;
int k = n|m; //将n和m错位合并
System.out.println(Integer.toBinaryString(n));
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(k));
右移位运算:>>>
运算规则:将2进制数整体向右移动,低位自动溢出舍弃,高位补0
n = 01101011 00111111 01011110 00111010----0x6b3f5e3a
m = n>>>1 00110101 10011111 10101111 00011101
k = n>>>2 00011010 11001111 11010111 10001110
g = n>>>8 00000000 01101011 00111111 01011110
int n = 0x6b3f5e3a;
int m = n>>>1;
int k = n>>>2;
int g = n>>>8;
System.out.println(Integer.toBinaryString(n));
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(k));
System.out.println(Integer.toBinaryString(g));
左移位运算:<<
运算规则:将2进制数整体向左移动,高位自动溢出舍弃,低位补0
n = 01101110 10111100 00111011 00111011-------0x6ebc3b3b
m = n<<1 11011101 01111000 01110110 01110110
k = n<<2 10111010 11110000 11101100 11101100
g = n<<8 10111100 00111011 00111011 00000000
int n = 0x6ebc3b3b;
int m = n<<1;
int k = n<<2;
int g = n<<8;
System.out.println(Integer.toBinaryString(n));
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(k));
System.out.println(Integer.toBinaryString(g));
移位运算的数学意义:
int n = 5;
int m = n<<1;
int k = n<<2;
int g = n<<3;
System.out.println(m); //10----相当于5*2
System.out.println(k); //20----相当于5*4
System.out.println(g); //40----相当于5*8
/*
权: 64 32 16 8 4 2 1
n: 0 1 0 1 = 5
m: 0 1 0 1 = 10
k: 0 1 0 1 = 20
g: 0 1 0 1 = 40
*/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。