如何在ios中将开关状态转换为整数
我使用五个开关来处理不同类型的通知。为了记住开关的状态,我考虑将五个开关的状态转换为一个整数。例如,如果我的开关状态为以下01010,则整数应为10。请帮助我如何做到这一点如何在ios中将开关状态转换为整数,ios,objective-c,uiswitch,Ios,Objective C,Uiswitch,我使用五个开关来处理不同类型的通知。为了记住开关的状态,我考虑将五个开关的状态转换为一个整数。例如,如果我的开关状态为以下01010,则整数应为10。请帮助我如何做到这一点 首先提取每个开关值并将其存储在单个字符串中 现在将字符串转换为十进制/整数值,如下所示:- 编辑 以单个字符串获取所有开关控制值:- NSString *binarystring = [[NSString alloc] initWithFormat:@"%i%i%i%i%i",self.switch1.isOn,self.
编辑 以单个字符串获取所有开关控制值:-
NSString *binarystring = [[NSString alloc] initWithFormat:@"%i%i%i%i%i",self.switch1.isOn,self.switch2.isOn,self.switch3.isOn,self.switch4.isOn,self.switch5.isOn];
编辑 以单个字符串获取所有开关控制值:-
NSString *binarystring = [[NSString alloc] initWithFormat:@"%i%i%i%i%i",self.switch1.isOn,self.switch2.isOn,self.switch3.isOn,self.switch4.isOn,self.switch5.isOn];
(为什么要费心将5个开关值编码成一个整数?存储5个布尔值并不难。也就是说,问题是如何做到这一点……)
重要提示:布尔值不是0和1
Objective-C是C的超集,在原始C中没有布尔类型,而是使用了一个整数类型,解释为0为false,其他任何内容都为true
Objective-C将BOOL
定义为signed char
,即8位有符号整数类型(因为字符在C中只是整数类型)。因此,在Objective-C中,0是假的,-128..-1,1..127都是真的NO
定义为0
,YES
定义为1
,但各种操作可能会产生其他值
要从BOOL
b
获取0
或1
,可以使用条件运算符:
b ? 1 : 0
但是,根据定义,内置逻辑运算符将始终返回0
或1
,而不会返回任何其他可能的值。
运算符是逻辑not,两个not会让您回到开始的位置,因此:
!!b
还会给您一个0
或1
在任何采用BOOL
并试图将其用作0
或1
的代码中,您确实应该使用上述任一项(或等效项)
解决方法之一:使用字符串
您的问题被解释为在编码过程中使用字符串作为中介。首先假设该类将您的五个按钮作为简单数组存储在实例变量中(它将允许我们循环):
然后string方法的运行方式类似于:
- (void) stringMethod
{
NSMutableString *binarystring = NSMutableString.new;
// build up the string one value at a time, note the !! so we only get 0 or 1 values
for (int ix = 0; ix < kSWITCH_COUNT; ix++)
[binarystring appendFormat:@"%d", !!switches[ix].isOn];
long decimalValue = strtol([binarystring UTF8String], NULL, 2);
NSLog(@"Encoded: 0x%lx", decimalValue);
}
如果您不喜欢移位和OR,可以使用乘法和加法:
encoded = encoded * 2 + !!switches[ix].isOn;
上述方法直接解决了这个问题,不需要转换中间字符串。它恰好也快得多,但在应用程序的总体方案中,这两种方法都不可能占用大量的执行时间,因此您不应该基于此进行选择
第三条路
如果您希望设置/获取整数的各个位,可以使用具有位字段宽度的struct
类型。这些可以让您直接设置/获取整数的位-无需移位等-您可能会发现它们很有用,但它们相当“低级别”。任何关于C的好书都会告诉你如何使用这些
HTH(为什么要费心将5个开关值编码为一个整数?存储5个布尔值并不难。这说明问题是如何做到这一点…)
重要提示:布尔值不是0和1
Objective-C是C的超集,在原始C中没有布尔类型,而是使用了一个整数类型,解释为0为false,其他任何内容都为true
Objective-C将BOOL
定义为signed char
,即8位有符号整数类型(因为字符在C中只是整数类型)。因此,在Objective-C中,0是假的,-128..-1,1..127都是真的NO
定义为0
,YES
定义为1
,但各种操作可能会产生其他值
要从BOOL
b
获取0
或1
,可以使用条件运算符:
b ? 1 : 0
但是,根据定义,内置逻辑运算符将始终返回0
或1
,而不会返回任何其他可能的值。
运算符是逻辑not,两个not会让您回到开始的位置,因此:
!!b
还会给您一个0
或1
在任何采用BOOL
并试图将其用作0
或1
的代码中,您确实应该使用上述任一项(或等效项)
解决方法之一:使用字符串
您的问题被解释为在编码过程中使用字符串作为中介。首先假设该类将您的五个按钮作为简单数组存储在实例变量中(它将允许我们循环):
然后string方法的运行方式类似于:
- (void) stringMethod
{
NSMutableString *binarystring = NSMutableString.new;
// build up the string one value at a time, note the !! so we only get 0 or 1 values
for (int ix = 0; ix < kSWITCH_COUNT; ix++)
[binarystring appendFormat:@"%d", !!switches[ix].isOn];
long decimalValue = strtol([binarystring UTF8String], NULL, 2);
NSLog(@"Encoded: 0x%lx", decimalValue);
}
如果您不喜欢移位和OR,可以使用乘法和加法:
encoded = encoded * 2 + !!switches[ix].isOn;
上述方法直接解决了这个问题,不需要转换中间字符串。它恰好也快得多,但在应用程序的总体方案中,这两种方法都不可能占用大量的执行时间,因此您不应该基于此进行选择
第三条路
如果您希望设置/获取整数的各个位,可以使用具有位字段宽度的struct
类型。这些可以让您直接设置/获取整数的位-无需移位等-您可能会发现它们很有用,但它们相当“低级别”。任何关于C的好书都会告诉你如何使用这些
HTH这很容易——二进制到十进制的转换问题不清楚。01010的意思是,第一个开关关闭,第二个开关打开,第三个开关关闭,第四个开关打开,第五个开关再次打开。我希望这个布尔值是凸的