golang 使用位左移与iota计数配合可优雅地实现存储单位的常量枚举
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 使用位左移与iota计数配合可优雅地实现存储单位的常量枚举相关的知识,希望对你有一定的参考价值。
左移与右移
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上进行移动时就会报错?
最后执行的输入: [2,2,3,2]
int result = 0x00000000;
for (int i = 31; i >= 0; i--)
result =result<<1;
result += bit[i] % 3;
for (int i = 31; i >= 0; i--)
result =result<<1;
result += bit[i] % 3;
这是leetcode代码。
以上是关于golang 使用位左移与iota计数配合可优雅地实现存储单位的常量枚举的主要内容,如果未能解决你的问题,请参考以下文章