开发者学堂课程【GO 语言核心编程-基础语法、数组、切片、Map:位运算深度讲解】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9558
位运算深度讲解
内容简介:
一、位运算符和移位运算符
二、补码,反码,原码
三、Golang 中有2个移位运算符
一、位运算符和移位运算符
计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary) 数用0和1两个数字及其组合来表示任何数。
进位规则是“逢2进1”,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
在计算机的内部,运行各种运算时,都是以二进制的方式来运行。
原码、反码、补码
网上对原码,反码,补码的解释过于复杂,精简6句话:
对于有符号的而言:
1)表示1表示数1===》[0000 0001] -1===>[1000 0001]
2)正数的原码,反码,补码都一样
3)负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)1===>原码[00000001]反码[00000001]补码[00000001] -1==>原码[10000001]反码[11111110]补码[11111111
4)负数的补码它的反码+15)0的反码,补码都是0
5)在计算机运算的时候,都是以补码的方式来运算的1+1 11=1+(-1)
Golang 中有3个位运算.
分别是”按位与&、按位或)、按位异或^它们的运算规则是,
按位与&两位全为1结果为1.否则为0
按位或|两位有一个为1结果为1,否则为0
按位异或^两位一个为0一个为1结果为1,否则为0
案例练习
比如:2&3=? 23=? 2^3=?
//分别是”按位与&、按位或)、按位异或^它们的运算规则是,
按位与&两位全为1结果为1,否则为0
按位或|两位有一个为1结果为1,否则为0
按位异或^两位一个为0一个为1结果为1,否则为0
//运算规则,完成案例。针对这个,要运用分析说二与三等于多少,或321等于多少,打开一个表,求二与三,首先在计算的时候,都是以补码方式运行的,所以先求出2的补码,2是一个正数所以它的补码和原码一模一样,马上就能推出结果2的补码为0000 0010,3的补码,是一样的,都是正数3的补码:0000 0011,&只有都为一才为一,所以说2&3的结果0000 0010十进制为2。
package main
import (
"fmt "
func main()
var i int=5
//二进制输出
fmt.Printf("%b \n", i)
//八进制: 0-7,满8进1.以数字0开头表示
var j int.011110//11=>9
fst.Println("j=", j)
//6-9及A-F,满16进1.以 ex 或 ex 开头表示
var k int . 0x11 11 0x11=> 16+ 1 =17
fmt.Println("k=", k)
}
package main
func main() {
假如还有97天放假,问: xx个星期零xx天
var days int = 97
var week int = days 17
vardayint=days%7
fut.Printf( "%d个星期零%d天\n", week, day)
//定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:
1/5/9* (华氏温度-100),请求出华氏温度对应的摄氏温度
var huashi float32 3 134.2
varsheshi float32 3 5.0 , 9*(huashi一100)
fnt.Printf("%v对应的摄氏温度=%v \n", huash1, shesh1)
}
package main import(
"fmt"
func main()
{
//位运算的演示
fmt.Println(2&3)// 2
fmt.Println(2|3)// 3
fmt.Println(2^3)// 3
fmt.Println(-2^2) //4
}
二、补码,反码,原码
2&3
2的补码00000010
3的补码0000 0011
2&300000010 =>2
2|3=?
2的补码00000010
3的补码0000 0011
2|30000 0011 =>3
2^3
2的补码0000 0010
3的补码00000011
2^30000 0001 =>1
-2^2
-2的原码10000010=》反码11111101=>
补码11111110
11111110
2的补码0000010
-2^211111100(补码)==》原码
11111100=》反码11111011=》原码10000100》//-4
三、Golang 中有2个移位运算符
>>、<<右移和左移运算规则:
右移运算符>>:低位溢出符号位不变并用符号位补溢出的高位
左移运算符 <<:符号位不变,低位补0
案例演示
a := 1 >> 2//00000001=>=00000000=0
c:=1<<2 //00000001 ==> 00000100 => 4
package main
"fmt"
func main()
//位运算的演示
fmt . Println(2&3) // 2
fmt.Println(213) //3
fmt . Println(23) // 3
fmt.Println(-202) //-4
a:=1>>2//0
c:1<<2//4
fmt.Println
("a=", a,"c", c)