swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)...

swift:高级运算符

http://www.cocoachina.com/ios/20140612/8794.html

除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算。

 

不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的。溢出行为会被捕获并报告为错误。你是故意的?好吧,你可以使用Swift为你准备的另一套默认允许溢出的数值运算符,如可溢出加&+。所有允许溢出的运算符都是以&开始的。

 

自定义的结构,类和枚举,是否可以使用标准的运算符来定义操作?当然可以!在Swift中,你可以为你创建的所有类型定制运算符的操作。

 

可定制的运算符并不限于那些预设的运算符,自定义有个性的中置,前置,后置及赋值运算符,当然还有优先级和结合性。这些运算符的实现可以运用预设的运算符,也可以运用之前定制的运算符。

 

位运算符

位操作符通常在诸如图像处理和创建设备驱动等底层开发中使用,使用它可以单独操作数据结构中原始数据的比特位。在使用一个自定义的协议进行通信的时候,运用位运算符来对原始数据进行编码和解码也是非常有效的。

 

Swift支持如下所有C语言的位运算符:

 

按位取反运算符

按位取反运算符~对一个操作数的每一位都取反。

这个运算符是前置的,所以请不加任何空格地写着操作数之前。

  1. let initialBits: UInt8 = 0b00001111 
  2. let invertedBits = ~initialBits  // 等于 0b11110000 

UInt8是8位无符整型,可以存储0~255之间的任意数。这个例子初始化一个整型为二进制值00001111(前4位为0,后4位为1),它的十进制值为15。

 

使用按位取反运算~对initialBits操作,然后赋值给invertedBits这个新常量。这个新常量的值等于所有位都取反的initialBits,即1变成0,0变成1,变成了11110000,十进制值为240。

 

按位与运算符

按位与运算符对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1。

以下代码,firstSixBits和lastSixBits中间4个位都为1。对它俩进行按位与运算后,就得到了00111100,即十进制的60。

  1. let firstSixBits: UInt8 = 0b11111100 
  2. let lastSixBits: UInt8  = 0b00111111 
  3. let middleFourBits = firstSixBits & lastSixBits  // 等于 00111100 

按位或运算

按位或运算符|比较两个数,然后返回一个新的数,这个数的每一位设置1的条件是两个输入数的同一位都不为0(即任意一个为1,或都为1)。

如下代码,someBits和moreBits在不同位上有1。按位或运行的结果是11111110,即十进制的254。

  1. let someBits: UInt8 = 0b10110010 
  2. let moreBits: UInt8 = 0b01011110 
  3. let combinedbits = someBits | moreBits  // 等于 11111110 

按位异或运算符

按位异或运算符^比较两个数,然后返回一个数,这个数的每个位设为1的条件是两个输入数的同一位不同,如果相同就设为0。

以下代码,firstBits和otherBits都有一个1跟另一个数不同的。所以按位异或的结果是把它这些位置为1,其他都置为0。

  1. let firstBits: UInt8 = 0b00010100 
  2. let otherBits: UInt8 = 0b00000101 
  3. let outputBits = firstBits ^ otherBits  // 等于 00010001 

按位左移/右移运算符

左移运算符<<和右移运算符>>会把一个数的所有比特位按以下定义的规则向左或向右移动指定位数。

 

按位左移和按位右移的效果相当把一个整数乘于或除于一个因子为2的整数。向左移动一个整型的比特位相当于把这个数乘于2,向右移一位就是除于2。

 

无符整型的移位操作

对无符整型的移位的效果如下:

 

已经存在的比特位向左或向右移动指定的位数。被移出整型存储边界的的位数直接抛弃,移动留下的空白位用零0来填充。这种方法称为逻辑移位。

 

以下这张把展示了 11111111 << 1(11111111向左移1位),和 11111111 >> 1(11111111向右移1位)。蓝色的是被移位的,灰色是被抛弃的,橙色的0是被填充进来的。

  1. let shiftBits: UInt8 = 4   // 即二进制的00000100 
  2. shiftBits << 1             // 00001000 
  3. shiftBits << 2             // 00010000 
  4. shiftBits << 5             // 10000000 
  5. shiftBits << 6             // 00000000 
  6. shiftBits >> 2             // 00000001 

你可以使用移位操作进行其他数据类型的编码和解码。

  1. let pink: UInt32 = 0xCC6699 
  2. let redComponent = (pink & 0xFF0000) >> 16    // redComponent 是 0xCC, 即 204 
  3. let greenComponent = (pink & 0x00FF00) >> 8   // greenComponent 是 0x66, 即 102 
  4. let blueComponent = pink & 0x0000FF           // blueComponent 是 0x99, 即 153 

这个例子使用了一个UInt32的命名为pink的常量来存储层叠样式表CSS中粉色的颜色值,CSS颜色#CC6699在Swift用十六进制0xCC6699来表示。然后使用按位与(&)和按位右移就可以从这个颜色值中解析出红(CC),绿(66),蓝(99)三个部分。

 

对0xCC6699和0xFF0000进行按位与&操作就可以得到红色部分。0xFF0000中的0了遮盖了OxCC6699的第二和第三个字节,这样6699被忽略了,只留下0xCC0000。

 

然后,按向右移动16位,即 >> 16。十六进制中每两个字符是8比特位,所以移动16位的结果是把0xCC0000变成0x0000CC。这和0xCC是相等的,都是十进制的204。

 

同样的,绿色部分来自于0xCC6699和0x00FF00的按位操作得到0x006600。然后向右移动8們,得到0x66,即十进制的102。

 

最后,蓝色部分对0xCC6699和0x0000FF进行按位与运算,得到0x000099,无需向右移位了,所以结果就是0x99,即十进制的153。

 

有符整型的移位操作

有符整型的移位操作相对复杂得多,因为正负号也是用二进制位表示的。(这里举的例子虽然都是8位的,但它的原理是通用的。)

 

有符整型通过第1个比特位(称为符号位)来表达这个整数是正数还是负数。0代表正数,1代表负数。

 

其余的比特位(称为数值位)存储其实值。有符正整数和无符正整数在计算机里的存储结果是一样的,下来我们来看+4内部的二进制结构。

符号位为0,代表正数,另外7比特位二进制表示的实际值就刚好是4。

 

负数呢,跟正数不同。负数存储的是2的n次方减去它的绝对值,n为数值位的位数。一个8比特的数有7个数值位,所以是2的7次方,即128。

 

我们来看-4存储的二进制结构。

现在符号位为1,代表负数,7个数值位要表达的二进制值是124,即128 - 4。

负数的编码方式称为二进制补码表示。这种表示方式看起来很奇怪,但它有几个优点。

 

首先,只需要对全部8个比特位(包括符号)做标准的二进制加法就可以完成 -1 + -4 的操作,忽略加法过程产生的超过8个比特位表达的任何信息。

第二,由于使用二进制补码表示,我们可以和正数一样对负数进行按位左移右移的,同样也是左移1位时乘于2,右移1位时除于2。要达到此目的,对有符整型的右移有一个特别的要求:

 

对有符整型按位右移时,使用符号位(正数为0,负数为1)填充空白位。

这就确保了在右移的过程中,有符整型的符号不会发生变化。这称为算术移位。

 

正因为正数和负数特殊的存储方式,向右移位使它接近于0。移位过程中保持符号会不变,负数在接近0的过程中一直是负数。

 

溢出运算符

默认情况下,当你往一个整型常量或变量赋于一个它不能承载的大数时,Swift不会让你这么干的,它会报错。这样,在操作过大或过小的数的时候就很安全了。

 

例如,Int16整型能承载的整数范围是-32768到32767,如果给它赋上超过这个范围的数,就会报错:

  1. var potentialOverflow = Int16.max 
  2. // potentialOverflow 等于 32767, 这是 Int16 能承载的最大整数 
  3. potentialOverflow += 1 
  4. // 噢, 出错了 

对过大或过小的数值进行错误处理让你的数值边界条件更灵活。

 

当然,你有意在溢出时对有效位进行截断,你可采用溢出运算,而非错误处理。Swfit为整型计算提供了5个&符号开头的溢出运算符。

 

溢出加法 &+

溢出减法 &-

溢出乘法 &*

溢出除法 &/

溢出求余 &%

 

值的上溢出

下面例子使用了溢出加法&+来解剖的无符整数的上溢出

  1. var willOverflow = UInt8.max 
  2. // willOverflow 等于UInt8的最大整数 255 
  3. willOverflow = willOverflow &+ 1 
  4. // 这时候 willOverflow 等于 0 

willOverflow用Int8所能承载的最大值255(二进制11111111),然后用&+加1。然后UInt8就无法表达这个新值的二进制了,也就导致了这个新值上溢出了,大家可以看下图。溢出后,新值在UInt8的承载范围内的那部分是00000000,也就是0。

 

值的下溢出

数值也有可能因为太小而越界。举个例子:

 

UInt8的最小值是0(二进制为00000000)。使用&-进行溢出减1,就会得到二进制的11111111即十进制的255。

 

Swift代码是这样的:

  1. var willUnderflow = UInt8.min 
  2. // willUnderflow 等于UInt8的最小值0 
  3. willUnderflow = willUnderflow &- 1 
  4. // 此时 willUnderflow 等于 255 

有符整型也有类似的下溢出,有符整型所有的减法也都是对包括在符号位在内的二进制数进行二进制减法的,这在 "按位左移/右移运算符" 一节提到过。最小的有符整数是-128,即二进制的10000000。用溢出减法减去去1后,变成了01111111,即UInt8所能承载的最大整数127。

来看看Swift代码:

  1. var signedUnderflow = Int8.min 
  2. // signedUnderflow 等于最小的有符整数 -128 
  3. signedUnderflow = signedUnderflow &- 1 
  4. // 如今 signedUnderflow 等于 127 

除零溢出

一个数除于0 i / 0,或者对0求余数 i % 0,就会产生一个错误。

  1. let x = 1 
  2. let y = x / 0 

使用它们对应的可溢出的版本的运算符&/和&%进行除0操作时就会得到0值。

  1. let x = 1 
  2. let y = x &/ 0 
  3. // y 等于 0 

优先级和结合性

运算符的优先级使得一些运算符优先于其他运算符,高优先级的运算符会先被计算。

 

结合性定义相同优先级的运算符在一起时是怎么组合或关联的,是和左边的一组呢,还是和右边的一组。意思就是,到底是和左边的表达式结合呢,还是和右边的表达式结合?

 

在混合表达式中,运算符的优先级和结合性是非常重要的。举个例子,为什么下列表达式的结果为4?

  1. 2 + 3 * 4 % 5 
  2. // 结果是 4 

如果严格地从左计算到右,计算过程会是这样:

2 plus 3 equals 5;

2 + 3 = 5

5 times 4 equals 20;

5 * 4 = 20

20 remainder 5 equals 0

20 / 5 = 4 余 0

 

但是正确答案是4而不是0。优先级高的运算符要先计算,在Swift和C语言中,都是先乘除后加减的。所以,执行完乘法和求余运算才能执行加减运算。

 

乘法和求余拥有相同的优先级,在运算过程中,我们还需要结合性,乘法和求余运算都是左结合的。这相当于在表达式中有隐藏的括号让运算从左开始。

  1. 2 + ((3 * 4) % 5) 

(3 * 4) is 12, so this is equivalent to: 3 * 4 = 12,所以这相当于:

  1. 2 + (12 % 5) 

(12 % 5) is 2, so this is equivalent to: 12 % 5 = 2,所这又相当于

  1. 2 + 2 

计算结果为 4。

 

查阅Swift运算符的优先级和结合性的完整列表,请看表达式。

 

注意:Swift的运算符较C语言和Objective-C来得更简单和保守,这意味着跟基于C的语言可能不一样。所以,在移植已有代码到Swift时,注意去确保代码按你想的那样去执行。

 

运算符函数

让已有的运算符也可以对自定义的类和结构进行运算,这称为运算符重载。

 

这个例子展示了如何用+让一个自定义的结构做加法。算术运算符+是一个两目运算符,因为它有两个操作数,而且它必须出现在两个操作数之间。

 

例子中定义了一个名为Vector2D的二维坐标向量 (x,y) 的结构,然后定义了让两个Vector2D的对象相加的运算符函数。

  1. struct Vector2D { 
  2.     var x = 0.0, y = 0.0 
  3. @infix func + (left: Vector2D, right: Vector2D) -> Vector2D { 
  4.     return Vector2D(x: left.x + right.x, y: left.y + right.y) 

该运算符函数定义了一个全局的+函数,这个函数需要两个Vector2D类型的参数,返回值也是Vector2D类型。需要定义和实现一个中置运算的时候,在关键字func之前写上属性 @infix 就可以了。

 

在这个代码实现中,参数被命名为了left和right,代表+左边和右边的两个Vector2D对象。函数返回了一个新的Vector2D的对象,这个对象的x和y分别等于两个参数对象的x和y的和。

 

这个函数是全局的,而不是Vector2D结构的成员方法,所以任意两个Vector2D对象都可以使用这个中置运算符。

  1. let vector = Vector2D(x: 3.0, y: 1.0) 
  2. let anotherVector = Vector2D(x: 2.0, y: 4.0) 
  3. let combinedVector = vector + anotherVector 
  4. // combinedVector 是一个新的Vector2D, 值为 (5.0, 5.0) 

这个例子实现两个向量 (3.0,1.0) 和 (2.0,4.0) 相加,得到向量 (5.0,5.0) 的过程。如下图示:

 

前置和后置运算符

上个例子演示了一个双目中置运算符的自定义实现,同样我们也可以玩标准单目运算符的实现。单目运算符只有一个操作数,在操作数之前就是前置的,如-a; 在操作数之后就是后置的,如i++。

 

实现一个前置或后置运算符时,在定义该运算符的时候于关键字func之前标注 @prefix 或 @postfix 属性。

  1. @prefix func - (vector: Vector2D) -> Vector2D { 
  2.     return Vector2D(x: -vector.x, y: -vector.y) 

这段代码为Vector2D类型提供了单目减运算-a,@prefix属性表明这是个前置运算符。

 

对于数值,单目减运算符可以把正数变负数,把负数变正数。对于Vector2D,单目减运算将其x和y都进进行单目减运算。

  1. let positive = Vector2D(x: 3.0, y: 4.0) 
  2. let negative = -positive 
  3. // negative 为 (-3.0, -4.0) 
  4. let alsoPositive = -negative 
  5. // alsoPositive 为 (3.0, 4.0) 

组合赋值运算符

组合赋值是其他运算符和赋值运算符一起执行的运算。如+=把加运算和赋值运算组合成一个操作。实现一个组合赋值符号需要使用@assignment属性,还需要把运算符的左参数设置成inout,因为这个参数会在运算符函数内直接修改它的值。

  1. @assignment func += (inout left: Vector2D, right: Vector2D) { 
  2.     left = left + right 

因为加法运算在之前定义过了,这里无需重新定义。所以,加赋运算符函数使用已经存在的高级加法运算符函数来执行左值加右值的运算。

  1. var original = Vector2D(x: 1.0, y: 2.0) 
  2. let vectorToAdd = Vector2D(x: 3.0, y: 4.0) 
  3. original += vectorToAdd 
  4. // original 现在为 (4.0, 6.0) 

你可以将 @assignment 属性和 @prefix 或 @postfix 属性起来组合,实现一个Vector2D的前置运算符。

  1. @prefix @assignment func ++ (inout vector: Vector2D) -> Vector2D { 
  2.     vector += Vector2D(x: 1.0, y: 1.0) 
  3.     return vector 

这个前置使用了已经定义好的高级加赋运算,将自己加上一个值为 (1.0,1.0) 的对象然后赋给自己,然后再将自己返回。

  1. var toIncrement = Vector2D(x: 3.0, y: 4.0) 
  2. let afterIncrement = ++toIncrement 
  3. // toIncrement 现在是 (4.0, 5.0) 
  4. // afterIncrement 现在也是 (4.0, 5.0) 

注意:默认的赋值符是不可重载的。只有组合赋值符可以重载。三目条件运算符 a?b:c 也是不可重载。

 

比较运算符

Swift无所知道自定义类型是否相等或不等,因为等于或者不等于由你的代码说了算了。所以自定义的类和结构要使用比较符==或!=就需要重载。

 

定义相等运算符函数跟定义其他中置运算符雷同:

  1. @infix func == (left: Vector2D, right: Vector2D) -> Bool { 
  2.     return (left.x == right.x) && (left.y == right.y) 
  3.  
  4. @infix func != (left: Vector2D, right: Vector2D) -> Bool { 
  5.     return !(left == right) 

上述代码实现了相等运算符==来判断两个Vector2D对象是否有相等的值,相等的概念就是他们有相同的x值和相同的y值,我们就用这个逻辑来实现。接着使用==的结果实现了不相等运算符!=。

 

现在我们可以使用这两个运算符来判断两个Vector2D对象是否相等。

  1. let twoThree = Vector2D(x: 2.0, y: 3.0) 
  2. let anotherTwoThree = Vector2D(x: 2.0, y: 3.0) 
  3. if twoThree == anotherTwoThree { 
  4.     println("这两个向量是相等的.") 
  5. // prints "这两个向量是相等的." 

自定义运算符

标准的运算符不够玩,那你可以声明一些个性的运算符,但个性的运算符只能使用这些字符 / = - + * % < >!& | ^。~。

 

新的运算符声明需在全局域使用operator关键字声明,可以声明为前置,中置或后置的。

  1. operator prefix +++ {} 

这段代码定义了一个新的前置运算符叫+++,此前Swift并不存在这个运算符。此处为了演示,我们让+++对Vector2D对象的操作定义为 双自增 这样一个独有的操作,这个操作使用了之前定义的加赋运算实现了自已加上自己然后返回的运算。

  1. @prefix @assignment func +++ (inout vector: Vector2D) -> Vector2D { 
  2.     vector += vector 
  3.     return vector 

Vector2D 的 +++ 的实现和 ++ 的实现很接近, 唯一不同的前者是加自己, 后者是加值为 (1.0, 1.0) 的向量.

  1. var toBeDoubled = Vector2D(x: 1.0, y: 4.0) 
  2. let afterDoubling = +++toBeDoubled 
  3. // toBeDoubled 现在是 (2.0, 8.0) 
  4. // afterDoubling 现在也是 (2.0, 8.0) 

自定义中置运算符的优先级和结合性

可以为自定义的中置运算符指定优先级和结合性。可以回头看看优先级和结合性解释这两个因素是如何影响多种中置运算符混合的表达式的计算的。

 

结合性(associativity)的值可取的值有left,right和none。左结合运算符跟其他优先级相同的左结合运算符写在一起时,会跟左边的操作数结合。同理,右结合运算符会跟右边的操作数结合。而非结合运算符不能跟其他相同优先级的运算符写在一起。

结合性(associativity)的值默认为none,优先级(precedence)默认为100。

以下例子定义了一个新的中置符+-,是左结合的left,优先级为140。

  1. operator infix +- { associativity left precedence 140 } 
  2. func +- (left: Vector2D, right: Vector2D) -> Vector2D { 
  3.     return Vector2D(x: left.x + right.x, y: left.y - right.y) 
  4. let firstVector = Vector2D(x: 1.0, y: 2.0) 
  5. let secondVector = Vector2D(x: 3.0, y: 4.0) 
  6. let plusMinusVector = firstVector +- secondVector 
  7. // plusMinusVector 此时的值为 (4.0, -2.0) 

这个运算符把两个向量的x相加,把向量的y相减。因为他实际是属于加减运算,所以让它保持了和加法一样的结合性和优先级(left和140)。查阅完整的Swift默认结合性和优先级的设置,请移步表达式;

转载于:https://www.cnblogs.com/XYQ-208910/p/4911330.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

收集、报告或保存系统活动信息:sar命令

2019独角兽企业重金招聘Python工程师标准>>> 索引 sar命令的使用常用方法 查看网络设备&#xff08;网卡&#xff09;的状态信息查看socket使用情况查看cpu使用情况(默认)查看内存和交换空间使用情况查看内存的统计信息查看tty设备的活动状态查看等待运行的进程数和…

【GOF23设计模式】原型模式

【GOF23设计模式】原型模式 来源&#xff1a;http://www.bjsxt.com/ 一、【GOF23设计模式】_原型模式、prototype、浅复制、深复制、Cloneable接口 浅复制 1 package com.test.prototype;2 3 import java.util.Date;4 5 /**6 * 浅复制7 */8 public class Sheep implements C…

Deepfacelab 小白教程

不小心入了AI换脸的坑&#xff0c;但是感觉AI换脸很有意思&#xff0c;第一次感觉科研使我快乐。 目录 一、AI换脸软件简介 二、Deepfacelab下载安装 三、Deepfacelab Demo实现 四、Deepfacelab 填坑 五、总结 一、AI换脸软件简介 这个没有具体使用过&#xff0c;目前我…

Underscore.js 的模板功能

Underscore是一个非常实用的JavaScript库&#xff0c;提供许多编程时需要的功能的支持&#xff0c;他在不扩展任何JavaScript的原生对象的情况下提供很多实用的功能。 无论你写一段小的js代码&#xff0c;还是写一个大型的HTML5应用&#xff0c;underscore都能帮上忙。目前&…

ANSYS——查看剖面图的应力分布云图以及工作平面的相关设置

剖面图和切片图其实差不多,只是切片图只有一个截面,而剖面图是切去一部分保留另一部分模型,不但可以看到截面处应力分布还可以看到剩余模型的应力分布 切片应力云图可见:https://blog.csdn.net/qq_45769063/article/details/106357700 1.剖面云图的查看 首先将工作平面的…

2016.8.2

高端内存映射方式 高端内存映射分为三种&#xff1a;永久映射、临时映射和非连续动态内存映射。高端内存一般是指896MB以上的页框&#xff0c;这段区间内核一般不能直接访问。 1.永久映射 永久内核映射允许内核建立高端页框到内核地址空间的长期映射。它们使用主内核页表中的一…

深度学习之pytorch(三) C++调用

玩深度学习&#xff0c;个人觉得基于anaconda的python适合开发与测试&#xff0c;C适合实际的工程部署&#xff01;而pytorch官方有编译好的libtorch&#xff0c;特别方便&#xff0c;适合于我这样的伸手党和手残党(win10下编译tensorflow编译了好久都没通过&#xff0c;好忧伤…

机器学习(一) 基于sklearn库的数据集划分(交叉验证)

机器学习中首要环节就是数据集的处理&#xff0c;其中数据集的处理从个人理解(如有错误敬请谅解)的角度来说包括两个方面&#xff1a;数据集划分和数据清理。其中数据集划分是指训练集、验证集和测试集的数据类别划分&#xff1b;数据清理是指数据的清洗、删除等等方面。这两天…

敏捷项目开源管理软件ScrumBasic(2)- 多项目支持

1.加入Project对象模型 public class Project{[Key][MaxLength(32)]public string ID { get; set; }public string Name { get; set; }public int Order { get; set; }public ICollection<UserStory> Stories { get; set; }public ApplicationUser Creator { get; set; }…

postgresql表和列注释(描述)

2019独角兽企业重金招聘Python工程师标准>>> PostgreSQL添加表和列注释。本文为测试表test&#xff0c;默认无注释。 test# \d关联列表架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述 -------------------------------------------------public | test | …

Fifth scrum meeting - 2015/10/30

概述 从昨天开始&#xff0c;我们的开发工作终于进入了正轨&#xff0c;由于之前没有mooc服务器API接口&#xff0c;一些工作无法进行。 因为我们团队开始开发较晚&#xff0c;因此我们将开发阶段的截至时间定为了下周五&#xff0c;测试阶段则压缩为下周周六和周日两天。 我们…

计算机加入域 不能访问网络位置 解决办法

计算机加入域 不能访问网络位置 解决办法 启动以下服务 本文转自 onesthan 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/91xueit/1660286&#xff0c;如需转载请自行联系原作者

Android Camera HAL浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下&#xff1a; 景物(SCENE)通过镜头&#xff08;LENS&#xff09;生成的光学图像投射到图像传感器(Sensor)表面上&#xff0c;然后转为电信号&#xff0c;经过A/D&#xff08;模数转换&#xff09;转换…

win10 下pycharm+anaconda 编译生成pyd文件

由于生产部署的问题&#xff0c;需要把用python写的深度学习代码编译为可被调用的文件。上网搜索了下&#xff0c;暂时了解到win10下pyd文件比较流行。下面是直接引用某位博主的结论&#xff0c;个人感觉总结的很好。其中Cython库将已有的Python代码转化为C语言的代码&#xff…

JVM(4)之 使用MAT排查堆溢出

为什么80%的码农都做不了架构师&#xff1f;>>> 接下来讲解如何设置以及当发生堆溢出的时候怎么排查问题。先看一小段代码&#xff1a;   代码中使用了一个无限循环来为list添加对象&#xff0c;如果采用默认的堆大小的话可能要等待好久才能出现堆溢出的错误&a…

caffe 中的一些参数介绍

转自&#xff1a;http://blog.csdn.net/cyh_24/article/details/51537709 solver.prototxt net: "models/bvlc_alexnet/train_val.prototxt" test_iter: 1000 # test_interval: 1000 # base_lr: 0.01 # 开始的学习率 lr_policy: "step" # 学习率的…

python 制作二进制文件数据集(bin)

为了方便进行深度学习的程序调用与实现&#xff0c;需要将excel的数据文件转换为二进制文件。好处就是接口统一&#xff0c;读写速度快&#xff0c;节约空间。 一、调用库 使用xlrd读入execel表格&#xff0c;经过处理后转换为对应的dataframe结构&#xff0c;再使用pickle库…

远程连接mysql数据库注意点记录

一、如何新建独立帐号并设置权限 这里我使用Navicat作为我的数据库管理工具&#xff0c;打开Navicat。 选择“用户”--“新建用户” 输入用户名、主机、密码&#xff0c;需要注意的是&#xff0c;主机那不是写“localhost”&#xff0c;而是写“%” 然后可以设置“服务器权限”…

【域控管理】父域的搭建

从这篇博文开始&#xff0c;所有的域控系统都是在虚拟机中创建的。 在VM里安装Windows Server 2008 R2的方法就不多说了&#xff0c;无脑式安装&#xff0c;略过不提。 进到系统桌面&#xff0c;打开本地连接&#xff0c;设置网卡的IP地址&#xff0c;如下图&#xff1a; 注意&…

tensorflow2 tensorboard可视化使用

tensorflow2自带tensorboard&#xff0c;所以不必再自行安装tensorboard。 一、使用环境 win10 x64&#xff1b; anaconda3tensorflow2&#xff08;cpu版本&#xff09; 二、使用 1.在模型训练之前插入以下代码 log_dir os.path.join(logs) #win10下的bug&#xff0c; if…