go语言判断条件取反 golang判断字符串是否包含某字符串

go语言里怎么把整数变成负数取相反数?取一个数的相反数 , 可以用数学运算来实现:-1 * x的结果就是x的相反数 。
golang 正则正则表达式反向查询基本上所有的语言都有正则表达式 , golang也不例外 。golang原生使用regexp包进行正则表达式的匹配 。正常情况下满足基础的查询功能 。但是,golang为了正则表达式的效率一直坚持O(n)的搜索复杂度,所以有些高级特性将无法满足 。
正则表达式可以通过\1的形式反向查询之前匹配的数据,但是原生自带的regxp是不支持该特性 。所以只能使用第三方库来支持 。
golang 正负数取反想要知道取反计算过程,首先搞懂“原码“,“反码”,“补码”,“取反” 。
0变1,1变0
原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值 。原码表示法在最高位为符号:正数该位为0 , 负数该位为1,原码又称带符号的绝对值 。看整数9及-9的原码如下:
9的原码:0000 1001
-9的原码: 1000 1001
重点:对于源码,绝对值相等的正数和负数只有符号位不同 。
反码通常是用来由原码求补码或者由补码求原码的过渡码 。正数的反码就是其原码,负数的反码就是将原码除符号位以外每位取反(0变1,1变0) 。例如:
9的反码:0000 1001
-9的反码:1111 0110
在计算机系统中,数值一律用补码来表示和存储 。正数的原码就是其补码 。负数的补码是其反码+1.例如:
9的补码:0000 1001
-9的补码:1111 0111
正整数的原码、反码、补码都是一样的 。负数的反码是除符号位其他每一位取反,负数的补码是其反码+1
首先明确一个概念,由于在计算机中二进制都是以其补码形式存放在内存中的 。所以要知道 ^9 就是对 9 的补码取反,也就是说无论是整数还是负数对其取反都是对其补码取反 。
正数9:
原码为: 0000 1001
反码为: 0000 1001
补码为: 0000 1001
1. 取反结果=负数补码 :0000 1001 --- (取反) 1111 0110
注:由于 ^ 位取反操作符 , 对于符号位也会取反 所以这里得到一个负数的补码,想要计算其真实的值 。还需要将其转换成原码 。
2. 得反码:1111 0110-1=1111 0101
【go语言判断条件取反 golang判断字符串是否包含某字符串】 补码 = 反码 + 1 (反推) 反码 = 补码 - 1
3. 得原码 1111 0101 -- 1111 1010 = -10
原码=反码取反
负数-9:
原码为: 1111 1001
反码为: 1111 0110
补码为: 1111 0111
1. 取反结果=正数补码 1111 0111 ---- 0000 1000
2. 正数原码 = 反码 = 补码 = 0000 1000 = 8
go语言操作符 ^ 和 &^很多语言都是采用 ~ 作为按位取反运算符,Go 里面采用的是 ^。
如果作为二元运算符,^ 表示按位异或,即:对应位相同为 0 , 相异为 1 。
操作符 ^,按位置零,例如:z = x ^ y,表示如果 y 中的 bit 位为 1,则 z 对应 bit 位为 0,否则 z 对应 bit 位等于 x 中相应的 bit 位的值 。
对于有符号的整数来说,是按照补码进行取反操作的(快速计算方法:对数 a 取反,结果为 -(a+1) ) , 对于无符号整数来说就是按位取反
计算过程
以3为例3在内存中补码为 0*** 0011
取反1*** 1100
-1操作1*** 1011
除符号位取反1*** 0100 结果为-4
-------------------------------------------
以9为例 9在内存中补码为 0*** 1001
取反1*** 0110
-1操作1*** 0101
除符号位取反1*** 1010 结果为-10
-------------------------------------------
以-5为例 -5在内存中为的补码为 1*** 1011

推荐阅读