我正在尝试将整数值转换为内容对齐方式。整数可以同时保持水平和垂直对齐。
首先我创建了一个enum,它描述了所有可能性(我必须使用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 | GravityTop
将是53。
我想检查我的视图对象的对齐方式:
if ((textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter){
return NSTextAlignmentCenter;
}...
但似乎缺少某些东西,因为对于53 if语句textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter
返回True
。
答案 0 :(得分: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
价值可能不正确。
答案 1 :(得分:1)
因为这些值不适合用作位标志(掩码)。
&
不是魔法 - 它只是按位AND
运算符。如果您按AND
数字1
,则将结果与1
进行比较,只检查原始数字中是否设置了最低有效位,即i。即如果它是奇怪的。因此,(textAlignment & GravityHorizontalCenter) == GravityHorizontalCenter
将为任何奇数生成真。
如果你想使用数字作为标志,你必须使它们具有不同的2的幂,如下所示:
GravityHorizontalCenter = 1,
GravityLeft = 2,
GravityRight = 4,
GravityVerticalCenter = 8,
GravityTop = 16,
GravityBottom = 32,