golang 使用位左移与iota计数配合可优雅地实现存储单位的常量枚举

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 使用位左移与iota计数配合可优雅地实现存储单位的常量枚举相关的知识,希望对你有一定的参考价值。

type ByteSize float64
const (
	_ = iota // 通过赋值给空白标识符来忽略值
	KB ByteSize = 1<<(10*iota)
	MB
	GB
	TB
	PB
	EB
	ZB
	YB
)

左移与右移

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 typedef unsigned char byte;
 6 int main() 
 7     int x =0x800000002;//-2的原码
 8     cout << x << endl;//输出 -2147483646
 9 
10     x = 0xFFFFFFFE;//-2,说明数值是以补码的形式存储的
11     cout <<x << endl;//输出-2
12 
13     byte x3 = -2;//0xFE
14     cout <<(int)x3 << endl;//输出254
15 
16     byte x4 = 0xFE;
17     cout <<(int)x4 << endl;//输出254
18 
19     int x5 = -2;
20     x5 =x5>> 2;
21     cout << x5<< endl;//输出-1
22 
23     int x6 = 8;
24     x6 =x6>> 2;
25     cout << x6<< endl;/输出2
26 
27     int x9 = -8;
28     x9 =x9<<3;
29     cout <<x9 << endl;//输出-64
30     
31     cout << sizeof(short) << endl;//2    
32     short x10 = 8;    
33     x10 <<=32;    
34     cout<<x10<<endl;    //输出8   
35     short x11 = 0xFFFE;     
36     cout<<x11<<endl;//-2      
37     x11 >>=2;     
38     cout<<x11<<endl;//输出-1
39 
40     int x12 = -1;
41     x12 = x12 << 1;
42     cout << x12 << endl;
43     system("pause");
44     return 0;
45 

 以上的实验说明计算机中负数是以补码的形式存在的。而且无论是负数还是整数左移就相当于乘以2,右移就相当于除以2。左移时,在后面填上0,右移时在前面补上符号位。这是算术移动。

逻辑移动就是不管往哪边移动,都补0。

 

然而我这里出现的问题是:

为什么我在vs上面进行负数移动时不会报错,在leetcode上进行移动时就会报错?

执行出错信息: Line 15: Char 27: runtime error: left shift of negative value -1 (solution.cpp)
最后执行的输入: [2,2,3,2]
 
int result = 0x00000000;
        for (int i = 31; i >= 0; i--)
            result =result<<1;
            result += bit[i] % 3;
       
这是leetcode代码。
 
 
 

以上是关于golang 使用位左移与iota计数配合可优雅地实现存储单位的常量枚举的主要内容,如果未能解决你的问题,请参考以下文章

golang使用iota

为啥逻辑左移与算术左移相同?

左移与右移

C语言位运算符:与或异或取反左移与右移详细介绍

C语言位运算符:与或异或取反左移与右移详细介绍

GoLang 快速入门 合理实用常量