public static void main(String[] args) {
int maxInt = (1 << 31) - 1;
int maxInt1 = ~(1 << 31);
int maxInt2 = (1 << -1) - 1;
int maxInt3 = (-1>>>1);
System.out.println("十进制: "+ maxInt +" ,二进制: " + Integer.toBinaryString(maxInt));
System.out.println("十进制: "+ maxInt1 +" ,二进制: " + Integer.toBinaryString(maxInt1));
System.out.println("十进制: "+ maxInt2 +" ,二进制: " + Integer.toBinaryString(maxInt2));
System.out.println("十进制: "+ maxInt3 +" ,二进制: " + Integer.toBinaryString(maxInt3));
}
/** ~output~
十进制: 2147483647 ,二进制: 1111111111111111111111111111111
十进制: 2147483647 ,二进制: 1111111111111111111111111111111
十进制: 2147483647 ,二进制: 1111111111111111111111111111111
十进制: 2147483647 ,二进制: 1111111111111111111111111111111
*/
exp:int类型为32位,要获得int的最大值,只需要最高位为0(正数),其余位为1,便可得到最大数[01111111 11111111 11111111 11111111](2进制)、[0xFFFFFFF](16进制)。
public static void main(String[] args) {
int minInt = 1 << 31;
int minInt1 = -1 << 31;
int minInt2 = 1 << -1;
System.out.println("十进制: "+ minInt +" ,二进制: " + Integer.toBinaryString(minInt));
System.out.println("十进制: "+ minInt1 +" ,二进制: " + Integer.toBinaryString(minInt1));
System.out.println("十进制: "+ minInt2 +" ,二进制: " + Integer.toBinaryString(minInt2));
System.out.println("十进制: "+ 0x80000000 +" ,二进制: " + Integer.toBinaryString(0x80000000));
}
/** ~output~
十进制: -2147483648 ,二进制: 10000000000000000000000000000000
十进制: -2147483648 ,二进制: 10000000000000000000000000000000
十进制: -2147483648 ,二进制: 10000000000000000000000000000000
十进制: -2147483648 ,二进制: 10000000000000000000000000000000
*/
exp:int类型为32位,要获得int的最大值,只需要最高位为1(负数),其余位为0,便可得到最大数[10000000 00000000 00000000 00000000](2进制)、[0x80000000](16进制)。
负数最小二进制和正数最大二进制似乎有很大区别,这是因为cpu中只有加法器,减法只是加法的一种形式,而计算机是如何通过加法来计算减法的呢?
计算机对负数的实际表示是补码形式,补码的计算是以负数绝对值的原码(二进制)取反[不操作符号位],再加1得到,举个例子:
// 计算n*(2^m)
public static int mulTwoPower(int n,int m){
return n << m;
}
// 计算n/(2^m)
public static int divTwoPower(int n,int m){
return n >> m;
}
public static void main(String[] args) {
System.out.println("5 * 2 * 2 * 2 = "+ mulTwoPower(5, 3) );
System.out.println("6 / 2 / 2 = "+ divTwoPower(6, 2) );
}
/** ~output~
5 * 2 * 2 * 2 = 40
6 / 2 / 2 = 1
*/
我们知道十进制是逢十进一,二进制是逢二进一 ,十进制*10,扩大原来的10倍,尾部多一个0,二进制*2,扩大原来的2倍,尾数也多一个0,这便相当于二进制数左移<<1位,0000 1111 * 2 = 0001 1110, 除以2则反之。
// true 奇数 false 偶数
public static boolean isOddNumber(int n){
return (n & 1) == 1;
}
public static void main(String[] args) {
System.out.println("5 是 "+ isOddNumber(5) );
System.out.println("1234 是 "+ isOddNumber(1234) );
}
/** ~output~
5 是 true
1234 是 false
*/
这里知识是二进制最尾部的尾数为1,则此数必为奇数,尾数为0,此数必为偶数。所以通过与运算便可确定这个数的奇偶性。
public static int indexFor(int m, int n){
return m & (n - 1);
}
public static void main(String[] args) {
System.out.println("19 与 16 求余 = "+ indexFor(19, 16) );
System.out.println("19 与 16 求余 = "+ 19 % 16 );
}
/** ~output~
19 与 16 求余 = 3
19 与 16 求余 = 3
*/
此方法中n为2的指数值,则其二进制形式的表示中只存在一个1,其余位都为0,例如: 0000 1000、0100 0000、0010 0000等等。
则n-1的二进制形式就为1的位数变为0,其右边位全变为1,例如16的二进制 0001 0000 -1 = 0000 1111
测试m为19的二进制 0001 0011 & 0000 1111 = 0000 0011 = 3,地位保留的结果便是余数。
此位运算也是HashMap中确定元素键(key)值所在哈希数组下标位置的核心方法,此位运算(hash & (length - 1))的效率极高于hash % length的求余, 所以也解释了为什么HashMap的扩容始终为2的倍数(2的指数值)。
// 快速幂算法求n的m次方
public static int power(int n, int m) {
int temp = 1, base = n;
while (m != 0) {
if ((m & 1) == 1) { // 判断奇偶,
temp = temp * base;
}
base = base * base;
m >>= 1; // 舍弃尾部位
}
return temp;
}
public static void main(String[] args) {
System.out.println("3的3次方 = " + power(3,3));
System.out.println("5的7次方 = " + power(5,7));
}
/** ~output~
3的3次方 = 27
5的7次方 = 78125
*/
我们知道,求n的m次方最简单暴力的方法是循环m次求n的乘积,如今的计算机非常强大,这方面的性能似乎完全可以忽略优化,但对于微型机来说,代码优化应该是你时时刻刻需要考虑的,我们也从另外的问题出发:如何使用更少的时间复杂度去实现n的m次方呢?
快速幂算法,下面来看下他的实现原理。
在数学中,存在等式n^m = n^(m1+m2+m3+.....+mk) = n^m1 * n^m2 * n^m3 * ...* n^mk, 且m1 + m2 + m3 +....+mk = m
我们计算m的二进制,如上示例幂数7的二进制=0000 0111,他的十进制计算为: 1+2+4,所以5^7 = 5^(1+2+4) = 5^1 * 5^2 * 5^4,可以看出时间复杂度为f(n)=lgn
数据库status字段的值有:-1,0,1设置过滤字段,发现sql_attr_uint不支持负数,后改用sql_attr_bigintsql_attr_bigint = statussql_attr_uint:整数属性被声明的列的值必须在32位无符号整型可表示的范围内。超出此范围的值也会被接受,但会溢出。例如-1会变成 2^32-1 或者说4,294,967,295。sql_a...
Oracle Spatial中SDO_Geometry说明在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw、ESRI的ST_Geometry以及基于Oracle Spatial的SDO_Geometry等等。关于这几种方式的各自的优缺点不是主要的探讨的方向,这些我们可以通过ArcGIS中的ArcGIS Se...
转自:小小看护 grepLinux grep命令用于查找文件里符合条件的字符串。grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为"-",则grep指令会从标准输入设备读取数据。语法grep [-abcEFG...
C++加载PB模型OS:Ubantu18.04Tensorflow动态库版本:Tensorflow2.1OpenCV版本:3.7cmake:3.10.2MakeLists.txtcmake_minimum_required(VERSION 2.8.8)project(demo)set(CMAKE_CXX_STANDARD 11)set(tensorflow_path /home/tensorflow)set(current_project /home/yuxiubin-test/d
文章大纲一、mybatis介绍二、mybatis代码实战三、项目源码下载四、参考文章一、mybatis介绍1. mybatis是什么?mybatis是一个持久层的框架,是apache下的顶级项目。mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。mybatis让程序将主要精力放在sql...
前言介绍:主要是基于v3.0的API版本进行的离线,纯内网可操作,基本上实现了现有90%以上的功能点,能兼容jpg和png格式的瓦片图层,实现了原生和基于Vue两个版本(包含常用的55个示例),实现的功能点概要如下:地图示例:地图展示同时加载两个地图设置地图最大及最小级别移动地图缩放地图拖拽地图设置地图显示范围获取地图显示范围测距地图控件:工具条、比例尺控件 地图类型缩略图控件添加版权控件添加自定义控件覆盖物示例:添加/删除覆盖物折线上添加方向箭头添加动画标
SurfaceTexture是从Android3.0(API 11)加入的一个新类。SurfaceTexture用来捕获视频流(stream)中的图像帧(image frame)的,视频流可以是相机预览或者视频解码数据。SurfaceTexture可以作为android.hardware.camera2、MediaCodec、MediaPlayer、和 VideoDecode这些类的目标视频数据输...
接上一版4)设计实现过程。整个程序实现大体是使用c语言完成的,一共设计了8个函数。分别有判错,处理-c命令,处理-s命令,DFS搜索等等类别。5)程序改进。之前的想法是裸爆搜,写完之后发现真的是太慢了,跑10000组用例就需要4s钟。后来 改进了算法之后,100w也能够在2s左右跑完。下面展示 性能分析图。前后 两次对比可以发现,性能有些变化。下面这个是单独的对函数和变量的测试,createJGG...
记录一个简单的bug在使用keras时,需要取出一个tensor的某一维作为下一层的维度(这里,我是在写attention)代码:dim = input.shape[1]dense = Dense(dim,activation=‘softmax’)(input)报错:TypeError: unsupported operand type(s) for : ‘int’ and ‘Dime...
PyQt5 安装安装PyQt5 问题 : pip需要升级先升级pip : python -m pip install --upgrade pip安装PyQt5: pip install PyQt5安装tools :pip install PyQt5-tools检查功能import sysfrom PyQt5 import QtWidgets, QtCoreapp = Q...
import randoma = [1, 2, 3]b = [4, 5, 6]c = list(zip(a,b))print(zip(a,b))print(c)a1, b1 = zip(*c)print(a1)print(b1)random.shuffle(c)a2, b2 = zip(*c)print(a2)print(b2)结果为:...