如何在ios中将开关状态转换为整数

如何在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.

我使用五个开关来处理不同类型的通知。为了记住开关的状态,我考虑将五个开关的状态转换为一个整数。例如,如果我的开关状态为以下01010,则整数应为10。请帮助我如何做到这一点

  • 首先提取每个开关值并将其存储在单个字符串中
  • 现在将字符串转换为十进制/整数值,如下所示:-

  • 编辑

    以单个字符串获取所有开关控制值:-

    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的意思是,第一个开关关闭,第二个开关打开,第三个开关关闭,第四个开关打开,第五个开关再次打开。我希望这个布尔值是凸的