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

时间:2016-02-10 06:49:15

标签: ios objective-c uiswitch

我使用五个开关来处理不同类型的通知。为了记住交换机的状态,我正在考虑将五个交换机的状态转换为整数。例如,如果我的开关状态如下,01010那么整数应为10.请帮我如何实现这一点。

2 个答案:

答案 0 :(得分:3)

  1. 首先提取每个开关值并将其存储在单个字符串中
  2. 现在将字符串转换为十进制/整数值,如下所示: -
  3.  NSString * binarystring = @"01010";
     long decimalValue = strtol([binarystring  UTF8String], NULL, 2);
     NSLog(@"%ld", decimalValue ); 
    

    修改

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

    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];
    

答案 1 :(得分:-1)

(为什么要将你的5个开关值编码成一个整数呢?存储5个布尔值并不难。那就说问题是如何做到这一点......)

重要的是:BOOL值不是0和1

Objective-C是C的超集,并且在原始C中没有布尔类型 - 而是仅使用整数类型,其解释为0为假且其他为真。

Objective-C将BOOL定义为signed char,这是一个8位有符号整数类型(因为字符只是C中的整数类型)。所以在Objective-C 0中是假的,-128 ..- 1,1,1127都是真的。 NO定义为0YES定义为1,但各种操作可能会产生其他值。

要从0 1获取BOOLb,您可以使用条件运算符:

b ? 1 : 0

但是,内置的逻辑运算符按定义将始终返回01,而不会返回任何其他可能的值。 !运算符不合逻辑,两个不能让您回到原来的位置:

!!b

还会为您提供01

在任何需要BOOL并尝试将其用作01的代码中,您应该使用上述其中一种(或等效的)。

解决问题的一种方法:使用字符串

您的问题已被解释为在编码期间使用字符串作为中介。首先假设类将您的五个按钮存储在一个实例变量中作为一个简单的数组(它将允许我们循环):

const int kSWITCH_COUNT = 5; // let's not hard code it everywhere

@implemention MyClass
{
   Switch *switches[kSWITCH_COUNT];
}

然后字符串方法类似于:

- (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);
}

这种方法有效,但它是一种获得结果的迂回方式 - 你有5个整数(布尔)值,你想将它们组合成一个整数,为什么要涉及字符串?

更好的解决方法:使用整数

(目标 - )C提供按位运算符来执行移位,或等操作,将整数类型视为有序的位集合 - 这就是它们在计算机上的位置。

<<运算符左移,例如0x1 << 1生成0x2,即<< 1相当于乘以2. |运算符是按位或者,例如0x1&lt;&lt; 1 | 1 produces 0x3`。您现在可以轻松地回答您的问题:

- (void) shiftMethod
{
   unsigned int encoded = 0;

   for (int ix = 0; ix < kSWITCH_COUNT; ix++)
      encoded = (encoded << 1) | !!switches[ix].isOn;

   NSLog(@"Encoded: 0x%x", encoded);
}

如果你不喜欢轮班和ors,你可以使用乘法和加法:

     encoded = encoded * 2 + !!switches[ix].isOn;

上面直接解决了问题,没有转换到/来自中间字符串。它恰好也快得多,但在应用程序的整体方案中,这两种方法都不会花费很大一部分执行时间,你也不应该根据它进行选择。

第三种方式

如果您希望设置/获取整数的各个位,可以使用具有位字段宽度的struct类型。这些让你直接设置/获取一个整数的位 - 不需要移位等 - 你可能会发现它们很有用,但它们更像是低级别的#34;。任何关于C的好书都会告诉你如何使用它们。

HTH