golang位移运算

2021-03-29  本文已影响0人  n_xy

之前是写java的,没有无符号有符号之分,最近刷题碰到了位运算的题,就想把这个搞清楚一点。

整数类型

类型 范围
int8 -128到127
uint8 0到255
int16 -32768到32767
uint16 0到65535
int32 -2147483648到2147483647
uint32 0到4294967295
int64 -9223372036854775808到9223372036854775807
uint64 0到18446744073709551615

另外常用的int类型是有符号数,位长取决于你的电脑的位长,电脑是64位的int就是64位的。

位移运算符

左移 <<
右移>>

规则

首先无符号数没啥好说的,不管左移还是右移都是补0

有符号数,以int为例(64位)
老样子,机器内存的是补码
以7fffffffffffffffff为例

a := 0x7fffffffffffffff
fmt.Printf("%x",a)
//out :7fffffffffffffff
b=-0x7fffffffffffffff
fmt.Printf("%x",b)
//out:-7fffffffffffffff
c := 0xffffffffffffffff
fmt.Printf("%x",a)
//err :超出范围

a =a<<1
fmt.Printf("%x",a)
//out:-2

a = a>>1
//out -1
a= a>>100
//out -1

从前三个输出看,没有办法直接给int赋最大值(16进制),全f的话会报错,也就是不能直接赋值符号位,
但是第四个输出来看,这里的运算是逻辑位移,输出-2(ffffffffffffffe,找了半天也没找到怎样输出正儿八经的16进制数),也就是位移包括符号位.
之后再右移多少位都是-1(ffffff...f),就是补码位移规则

综上:

  1. int类型 赋值要标明符号
  2. 位移运算符号位参加,按照补码运算规则(左移补0,右移补符号位

。。。。好乱

上一篇下一篇

猜你喜欢

热点阅读