百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

golang2021运算符与进制(10)位运算

xsobi 2024-11-23 10:51 1 浏览

Go语言位运算符

位运算符是对整数在内存中的二进制位进行操作。

?

位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能。如果要开发高效率程序,位运算符是必不可少的。位运算符用来对二进制位进行操作,包括:按位与(&)、按位或(|)、按位异或(^)、按位左移(<<)、按位右移(>>)。

?

假定 A = 60,B = 13,其二进制数转换如下。

A = 0011 1100

B = 0000 1101

?

A&b = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

Go语言支持的位运算符如下表所示。(假定 A 为 60,B 为 13)

?

?

运算符

描述

实例

&

按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进制位相与

(A&B) 结果为 ?12,二进制为 0000 1100

|

按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进制位相或

(A|B) 结果为 61,二进制为 ?0011 1101

^

按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进制位相异或,当两对应的二进制位相异时,结果为 ?1

(A^B) 结果为 49,二进制为 ?0011 0001

<<

左移运算符“<<”是双目运算符。左移 ?n 位就是乘以 2 的 n ?次方。其功能是把“<<”左边的运算数的各二进制位全部左移若干位,由“<<”右边的数指定移动的位数,高位舍弃,低位补 0

(A<<2) 结果为 ?240,二进制 1111 0000

>>

右移运算符“>>”是双目运算符。右移 ?n 位就是除以 2 的 n 次方。其功能是把“>>”左边的运算数的各二进制位全部右移若干位,“>>”右边的数指定移动的位数

(A>>2) 结果为 ?15,二进制为 0000 1111

表:位运算符

1、按位与

按位与(&):对两个数进行操作,然后返回一个新的数,这个数的每一位都需要两个输入数的同一位都为 1 时才为1。简单说就是,同一位同时为 1 则为 1,如下所示。

?

?

252&63









252

1

1

1

1

1

1

0

0

63

0

0

1

1

1

1

1

1

60

0

0

1

1

1

1

0

0

表:按位与

252 的二进制可以表示为 11111100,63 的二进制可以表示为 00111111,将每一位都进行与运算后结果为00111100,转换为十进制的结果为 60。

2、按位或

按位或(|):对两个数进行操作,然后返回一个新的数,这个数的每一位只要任意一个输入数的同一位为 1 则为1。简单说就是:同一位其中一个为 1 则为 1,如下所示。

?

?

178|94









178

1

0

1

1

0

0

1

0

94

0

1

0

1

1

1

1

0

254

1

1

1

1

1

1

1

0

表:按位或

178 的二进制可以表示为 10110010,94 的二进制可以表示为 01011110,将每一位都进行或运算后结果为11111110,转换为十进制的结果为 254。

3、按位异或

按位异或(^):对两个数进行操作,然后返回一个新的数,这个数的每一位只要两个输入数的同一位不同则为 1,如果相同就为0。简单说就是:同一位不相同则为 1,如下所示。

?

?

20^5









20

0

0

0

1

0

1

0

0

5

0

0

0

0

0

1

0

1

17

0

0

0

1

0

0

0

1

表:按位异或

20 的二进制可以表示为 00010100,5 的二进制可以表示为 00000101,将每一位都进行异或运算后结果为00010001,转换为十进制的结果为 17。

4、左移运算符

按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补 0。

1) 语法格式

需要移位的数字 << 移位的次数

例如,3 << 4,则是将数字 3 左移 4 位。

2) 计算过程

3 << 4

首先把 3 转换为二进制数字 0000 0000 0000 0000 0000 0000 00000011,然后把该数字高位(左侧)的 4 个 0 移出,其他的数字都朝左平移 4 位,最后在低位(右侧)的 4 个空位补 0。则得到的最终结果是 00000000 0000 0000 0000 0000 0011 0000,转换为十进制是 48。

3) 数学意义

在数字没有溢出的前提下,对于正数和负数,左移 1 位都相当于乘以 2 的 1 次方,左移 n 位就相当于乘以 2 的 n次方,如下所示。

?

?

3<<4









3

0

0

0

0

0

0

1

1

3<<4

0

0

1

1

0

0

0

0

48

3x2?








表:左移运算

3 的二进制可以表示为 00000011,将每一位向左移动 4 位,高位移出(舍弃),低位的空位补 0,运算结果为00110000,转换为十进制的结果为 48。

5、右移运算符

按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补 0,负数补 1。

1) 语法格式

需要移位的数字 >> 移位的次数

例如,11 >> 2,则是将数字 11 右移 2 位。

2) 计算过程

11 的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后 2个数字移出,因为该数字是正数,所以在高位补 0。则得到的最终结果是 0000 0000 0000 0000 0000 0000 00000010。转换为十进制是 2。

3) 数学意义

右移 1 位相当于除以 2,右移 n 位相当于除以 2 的 n 次方,如下所示。

?

?

11>>2









11

0

0

0

0

1

0

1

1

11>>2

0

0

0

0

0

0

1

0

2

11÷22








表:右移运算

11 的二进制可以表示为 00001011,每一位向右移动 2 位,低位移出(舍弃),高位正数补 0,运算结果为00000010,转换为十进制的结果为 2。

?

位运算符的用法,如下所示。

?

  1. package ? ? main

  2. import "fmt"

  3. func main() {

  4. var a uint = 60

  5. var b uint = 13

  6. var c uint = 0

  7. c = a & b

  8. fmt.Printf("第一行 - c 的值为 ? ? %d \n", c)

  9. c = a | b

  10. fmt.Printf("第二行 - c 的值为 ? ? %d \n", c)

  11. c = a ^ b

  12. fmt.Printf("第三行 - c 的值为 ? ? %d \n", c)

  13. c = a << 2

  14. fmt.Printf("第四行 - c 的值为 ? ? %d \n", c)

  15. c = a >> 2

  16. fmt.Printf("第五行 - c 的值为 ? ? %d \n", c)

  17. }

运行结果如下:

第一行 - c 的值为 12

第二行 - c 的值为 61

第三行 - c 的值为 49

第四行 - c 的值为 240

第五行 - c 的值为 15



相关推荐

js向对象中添加元素(对象,数组) js对象里面添加元素

一、添加一个元素对象名["属性名"]=值(值:可以是一个值,可以是一个对象,也可以是一个数组)这样添加进去的元素,就是一个值或对象或数组...

JS小技巧,如何去重对象数组?(一)

大家好,关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。方法一:使用.filter()和....

「C/C++」之数组、vector对象和array对象的比较

数组学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。模板类vector模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末...

如何用sessionStorage保存对象和数组

背景:在工作中,我将[{},{}]对象数组形式,存储到sessionStorage,然后ta变成了我看不懂的形式,然后我想取之用之,发现不可能了~记录这次深刻的教训。$clickCouponIndex...

JavaScript Array 对象 javascript的array对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

JavaScript中的数组Array(对象) js array数组

1:数组Array:-数组也是一个对象-数组也是用来存储数据的-和object不同,数组中可以存储一组有序的数据,-数组中存储的数据我们称其为元素(element)-数组中的每一个元素都有一...

数组和对象方法&amp;数组去重 数组去重的5种方法前端

列举一下JavaScript数组和对象有哪些原生方法?数组:arr.concat(arr1,arr2,arrn);--合并两个或多个数组。此方法不会修改原有数组,而是返回一个新数组...

C++ 类如何定义对象数组?初始化数组?linux C++第43讲

对象数组学过C语言的读者对数组的概念应该很熟悉了。数组的元素可以是int类型的变量,例如int...

ElasticSearch第六篇:复合数据类型-数组,对象

在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON...

第58条:区分数组对象和类数组对象

示例设想有两个不同类的API。第一个是位向量:有序的位集合varbits=newBitVector;bits.enable(4);bits.enable([1,3,8,17]);b...

八皇后问题解法(Common Lisp实现)

如何才能在一张国际象棋的棋盘上摆上八个皇后而不致使她们互相威胁呢?这个著名的问题可以方便地通过一种树搜索方法来解决。首先,我们需要写一个函数来判断棋盘上的两个皇后是否互相威协。在国际象棋中,皇后可以沿...

visual lisp修改颜色的模板函数 怎么更改visual studio的配色

(defunBF-yansemokuai(tuyuanyanse/ss)...

用中望CAD加载LISP程序技巧 中望cad2015怎么加载燕秀

1、首先请加载lisp程序,加载方法如下:在菜单栏选择工具——加载应用程序——添加,选择lisp程序然后加载,然后选择添加到启动组。2、然后是添加自定义栏以及图标,方法如下(以...

图的深度优先搜索和广度优先搜索(Common Lisp实现)

为了便于描述,本文中的图指的是下图所示的无向图。搜索指:搜索从S到F的一条路径。若存在,则以表的形式返回路径;若不存在,则返回nil。...

两个有助于理解Common Lisp宏的例子

在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。Lisp的宏,是实现上述特色的...