c - 如何对大小/类型不同的变量执行按位比较

标签 c bit-manipulation bitwise-operators bit-shift

我目前正在用 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/

相关文章:

c++ - 无法在C++的标准输出流(cout)中输出按位运算的结果

c++ - n 是负数、正数还是零?返回 1、2 或 4

c++ - C 中的内联参数是否复制了两次?

c - KDevelop 无法在 ubuntu 中调试?

c++ - 按列主要顺序重新排序 3D vector 三元组很慢

c++ - 溢出事件中的进位

c++ - "x += x & (-x)"是什么意思?

c++ - 获取 0 或依赖于 bool 值的值的好方法是什么?

c - AND 0xFF 有什么作用?

c - 编译时出错 : "invalid operands to binary/(have ‘short int *’ and ‘int’ )"