我目前正在用 C 语言解决一些小问题,所以这是我的问题:我要制作一个控制台程序,像这样在标准输入中获取俄罗斯方 block
.#..
.#..
.#..
.#..
..#.
###.
....
....
....
.##.
.##.
....
etc... (max 26 pieces)
而且我必须弄清楚如何使它们适合最小的正方形(不旋转)和最左上角的集中,以便为前面的示例输出以下内容:
ABB.
ABBC
ACCC
A...
(其中字母按出现顺序分配)。
所以我认为我的计算机测试一 block 是否适合 map 中某个点的最快方法是执行按位 &
操作。如果它给出 0,则它适合。
这样我就可以检查是否
1100
1100
0000
0000
适合:
1000
1000
1000
1000
我可以 if (a & b == 0)
如果它是真的那么它适合。现在我的作品不适合这种方式,但如果我将其向右移动,它将:
b >> 1 =
0110
0110
0000
0000
这样我就可以连续比较一 block 的可能位置,并在找到合适的位置时将其放在 map 上。
我唯一的问题是我的作品存放在 short int
(16 位)中,我必须将它与更大的类型(例如 long long
如果我的 map 是 8x8)0 因为它很容易从 :
0110
0110
0000
0000
到
0000
0000
0011
0011
只需移动位,但我怎样才能做到这一点:
00000000
00110000
00110000
00000000
00000000
00000000
00000000
00000000
在 0
的海洋中具有相同形状的 1
的 64 位 int。
最佳答案
当您在位移运算符中使用较小的类型(short int
)时,它会自动转换为int
。在您的情况下,这通常是不够的,但解决方案很简单:
首先将 block 分配给更大的类型,然后通过位掩码和移位来固定行。然后再次移动以将元素移动到您希望的位置。
我还建议使用无符号整数类型,因为在某些情况下,有符号类型的转换是实现定义的。当您使用它时,我真的建议您使用 stdint.h
中的 uintN_t
类型。
所以你需要这样的东西:
// bool type is from stdbool.h
bool isPieceInMap(uint16_t piece, uint64_t map) {
uint64_t bigPiece = piece;
// Fix lines
bigPiece =
(bigPiece & 0x000F) |
(bigPiece & 0x00F0) << 4 |
(bigPiece & 0x0F00) << 8 |
(bigPiece & 0xF000) << 12;
bigPiece = // Do position shifting as needed
return (bigPiece & map) == 0;
}
关于c - 如何对大小/类型不同的变量执行按位比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34712466/