让我们一起Go(八)

前言:

         叹时间总是那么滴不够,离上次发本系列文章又很久了,由于总总原因,到现在才更新,唉,不多说了,今天继续我们的Golang......

 

Go语言中的运算符

      

 

上述表格(引自网络)已经很清楚的展示了Go语言的运算符已经它们的优先级,对于非常常见的这里就不一一介绍了,这里举几个运算符来玩玩。

先看一例子:题目--给定一个int型数组,找出其中的奇数,打印出来?。大家动手试试,可以选择上面表格中的任意运算符完成。

这题目很简单,如果一个数不能被2整除,那么就是奇数,好,我们试试%运算符,该运算符是取模,也就是说可以取得余数,那么如果对2取模,结果不是0,那么就是奇数了。看代码:

 

这里定义了一个isOdd的方法用来判断数字是否是奇数,返回值是bool类型。该方法一个比较常见的错误是,有人会误认为模2后等于1 既 num%2==1则是奇数,但是这是不对的,因为当出现负数的时候,不管是奇数还是偶数都返回false,显然余数是负数的话不管如何都不会和1相等。如果你编译上面的代码,会发生奇怪的事情。尼玛,竟然是病毒???虽然明显是误报,但是我还是很诧异啊。不知道在你的机子上如何。

其实也没必要觉得奇怪,杀毒软件一般都是根据特征码来判断是否是病毒,因此,某个程序编译出来的应用恰好符合也是很有可能的,因此我们也常常看到杀毒软件误杀某某软件了。要解决这个其实也简单,有时候只需调整下代码结构或者内容就可以了,这里我在打印结果下增加一行换行代码 fmt.Println()就没问题了。

除了通过使用%运算符,其实还可以通过&运算符进行判断奇数。原理就是:

(一)位运算的时候,我们知道任何奇数的二进制表示最低位都是1,

例如 1 的二进制 0000 0001(为了方便描述,这里都取8位二进制来表示) ,3的二进制 0000 0011 ,21的二进制 0001 0101  ...

(二)而&运算规则是 1&1 = 1 ,0&0 = 0,0&1=0,1&0=0.总之0&任何数都是0 只有1&1才是1 。

那么我们就根据(一) (二)便可以拿1 二进制为 0000 0001 与任意数进行&运算,如果与1相&的数字是奇数,则结果高位全部是0,最低位1&1=1 最后是0000 0001。

最后代码如下:

 再来看一个Go语言中特别点的运算符 &^ 表示and not

假设 a &^ b 则该运算会从a上清除所有b的标志位,这是什么意思呢?还是看例子:

a : 0000 0000 0010 0011                  = 35

b:  0000 0000 1100 0101                  = 197

===================

     0000 0000 0010 0010                   = 34

标志位这里是指为1的位,如果你觉得这样记起来麻烦,其实它是先进行了a ^ b (XOR)运算,然后将结果与b再进行&运算。

 可以通过程序验证结果:

 

这次就到这里了,更多操作符的具体用法将会在以后相关知识点用到时再详细介绍。

 

 

posted @ 2013-03-21 22:05 Sirk 阅读(...) 评论(...) 编辑 收藏