C++ 关于将位图旋转90°;
我最近发现 被接受的答案和Rhubbarb的答案都很好,但我不明白它们是如何工作的。我不想在我的项目中使用我不理解的代码。我知道基本的位操作是什么(移位、AND、OR等),但我不明白这些操作的组合最终是如何完成它们正在做的事情的C++ 关于将位图旋转90°;,c++,bit-manipulation,C++,Bit Manipulation,我最近发现 被接受的答案和Rhubbarb的答案都很好,但我不明白它们是如何工作的。我不想在我的项目中使用我不理解的代码。我知道基本的位操作是什么(移位、AND、OR等),但我不明白这些操作的组合最终是如何完成它们正在做的事情的 感谢您关注这个问题,并希望能够帮助我。64位整数值表示为8×8块-让我们假设我们理解每个单元格的“内容”,如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2
感谢您关注这个问题,并希望能够帮助我。64位整数
值
表示为8×8块-让我们假设我们理解每个单元格的“内容”,如下所示:
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
虽然值实际上按顺序存储为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
我们还说将其向左移动四(value>4
)会
现在让我们看一看
uint64 reflect_vert (uint64 value)
{
value = ((value & 0xFFFFFFFF00000000ull) >> 32) | ((value & 0x00000000FFFFFFFFull) << 32);
value = ((value & 0xFFFF0000FFFF0000ull) >> 16) | ((value & 0x0000FFFF0000FFFFull) << 16);
value = ((value & 0xFF00FF00FF00FF00ull) >> 8) | ((value & 0x00FF00FF00FF00FFull) << 8);
return value;
}
然后将这些位向下(>32
)移动到较低32位的位置,或者向上(很好的解释!非常感谢!
5 6 7 8 9 10 11 12
13 14 15 16 17 18 19 20 ...
0 0 0 0 1 2 3 4
5 6 7 8 9 10 11 12 ...
uint64 reflect_vert (uint64 value)
{
value = ((value & 0xFFFFFFFF00000000ull) >> 32) | ((value & 0x00000000FFFFFFFFull) << 32);
value = ((value & 0xFFFF0000FFFF0000ull) >> 16) | ((value & 0x0000FFFF0000FFFFull) << 16);
value = ((value & 0xFF00FF00FF00FF00ull) >> 8) | ((value & 0x00FF00FF00FF00FFull) << 8);
return value;
}
((value & 0xFFFFFFFF00000000ull) >> 32)
((value & 0x00000000FFFFFFFFull) << 32)
value = ((value & 0xFFFFFFFF00000000ull) >> 32) | ((value & 0x00000000FFFFFFFFull) << 32);
33 34 35 36 37 38 39 40 \
41 42 43 44 45 46 47 48 |__
49 50 51 52 53 54 55 56 | |
57 58 59 60 61 62 63 64 / |
1 2 3 4 5 6 7 8 \ |
9 10 11 12 13 14 15 16 |__|
17 18 19 20 21 22 23 24 |
25 26 27 28 29 30 31 32 /
49 50 51 52 53 54 55 56 \__
57 58 59 60 61 62 63 64 / |
33 34 35 36 37 38 39 40 \__|
41 42 43 44 45 46 47 48 /
17 18 19 20 21 22 23 24 \__
25 26 27 28 29 30 31 32 / |
1 2 3 4 5 6 7 8 \__|
9 10 11 12 13 14 15 16 /
57 58 59 60 61 62 63 64 _
49 50 51 52 53 54 55 56
41 42 43 44 45 46 47 48 _
33 34 35 36 37 38 39 40
25 26 27 28 29 30 31 32 _
17 18 19 20 21 22 23 24
9 10 11 12 13 14 15 16 _
1 2 3 4 5 6 7 8
0000 0001 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 1000 0000
0100 0000 0010 0000
0001 0000 0000 1000
0000 0100 0000 0010
0000 0001 0000 0000
0000 0000 1000 0000
0100 0000 0010 0000
0001 0000 0000 1000
0000 0100 0000 0010