1

我正在尝试将整数值转换为内容对齐方式。整数可以同时保持水平和垂直对齐。

首先,我创建了一个枚举,它描述了所有可能性(我必须使用 android Gravity 类的值:http: //developer.android.com/reference/android/view/Gravity.html

typedef enum{
    GravityHorizontalCenter         = 1,    // (0x00000001) 
    GravityLeft                     = 2,    // (0x00000002) 
    GravityRight                    = 5,    // (0x00000005) 
    GravityVerticalCenter           = 16,   // (0x00000010) 
    GravityTop                      = 48,   // (0x00000030) 
    GravityBottom                   = 80,   // (0x00000050) 
} GravityType;

int alignment = GravityRight | GravityTop53也是这样。

我想检查我的视图对象的对齐方式,如下所示:

if ((textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter){

    return NSTextAlignmentCenter;
}...

但是似乎缺少了一些东西,因为对于 53,if 语句textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter返回True

4

2 回答 2

2

您需要垂直和水平范围的蒙版。

typedef enum{
    GravityHorizontalCenter         = 1,    // (0x00000001) 
    GravityLeft                     = 2,    // (0x00000002) 
    GravityRight                    = 5,    // (0x00000005) 
    GravityHorizontalMask           = 7,    // (0x00000007) 
    GravityVerticalCenter           = 16,   // (0x00000010) 
    GravityTop                      = 48,   // (0x00000030) 
    GravityBottom                   = 80,   // (0x00000050) 
    GravityVerticalMask             = 112,  // (0x00000070) 
} GravityType;

然后你可以做一个测试:

(textAlignment & GravityHorizontalMask) == GravityHorizontalCenter

或者

(textAlignment & GravityVerticalMask) == GravityTop

这些值只适合直接比较,因为 5(101 二进制)和 1(001 二进制)作为位掩码重叠。但是由于您将两个值存储在相同的数字中(前 4 位用于水平对齐,后 4 位用于垂直对齐),您需要一个掩码来隔离您要比较的位范围。

此外,您应该知道在 Android 上LEFT(左重力常数)的值是 3 而不是 2。因此,如果您的枚举确实需要与 Android 兼容,那么您的GravityLeft值可能不正确。

于 2013-06-07T13:13:22.427 回答
1

因为这些值不适合用作位标志(掩码)。

&不是魔术 - 它只是按位运算AND符。如果您AND将一个数字与1然后比较结果1,则只检查原始数字中是否设置了最低有效位,即它是否为奇数。因此,(textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter对于任何奇数都将产生真值。

如果要将数字用作标志,则必须使它们成为 2 的不同幂,如下所示:

GravityHorizontalCenter         = 1,
GravityLeft                     = 2,
GravityRight                    = 4,
GravityVerticalCenter           = 8,
GravityTop                      = 16,
GravityBottom                   = 32,
于 2013-06-07T13:12:28.130 回答