a25_scala Seq 集合(List)

scala outline

scala outline

scala 不可变List 创建 访问

  1. Scala 中的 List 和 Java List 不一样,在 Java 中 List 是一个接口,真正存放数据是 ArrayList,而 Scala 的 List 可以直接存放数据,List 属于序列 Seq(特质)的子类
  2. 默认情况下 Scala 的 List 是不可变的
    def main(args: Array[String]): Unit = {
    // 创建List集合,因为List是抽象的,只能通过apply方式创建
    val list: List[Int] = List(1, 2, 3, 4)
    
    // 访问方式 1
    list.foreach((x: Int) => {
      print(x + " ") // 输出 1 2 3 4
    })

    // 访问方式 2
    val it: Iterator[Int] = list.iterator
    while (it.hasNext){
      print(it.next()+" ") // 输出 1 2 3 4
    }

    //获取集合中的某一个元素
    println(list(1))
  }

scala 向不可变List中添加元素

  • :+ 和 +:
  def main(args: Array[String]): Unit = {
    // 通过 :+ 和 +: 给 list 追加元素(list1本身的集合并没有变化)
    var list1 = List(1, 2, 3, "abc")
    val list2 = list1.:+(4)
    // val list2 = list1 :+ 4
    println(list2) // 输出 List(1, 2, 3, abc, 4)
    val list3 = list1.+:(10)
    println(list3) // 输出 List(10, 1, 2, 3, abc)
  }
  • ::和:::
  1. 符号::表示向集合中添加元素
  2. 空集合怎么表示
// 方式1 
List()
// 方式2
Nil
  def main(args: Array[String]): Unit = {
    val list4 = List(1, 2, 3, "abc")
    // 表示向空集合中依次添加以下元素
    val list5 = 4 :: 5 :: 6 :: list4 :: Nil
    println("list5=" + list5)  // 输出 list5=List(4, 5, 6, List(1, 2, 3, abc))
  } 
  • :::

作用:扁平化

def main(args: Array[String]): Unit = {
    val list1: List[Int] = List(1, 2, 3, 4)
    val list2: List[Int] = List(5, 6)
    val newList0: List[Any] = list2.::(list1)
    println(newList0) // 输出 List(List(1, 2, 3, 4), 5, 6)
    // 扁平化 List(1, 2, 3, 4)
    val newList1: List[Int] = list1 ::: list2
    println(newList1) // 输出 List(1, 2, 3, 4, 5, 6)
  }

scala 可变List 创建 访问

    // 创建list
    val list1: ListBuffer[Int] = ListBuffer(1, 2, 3)
    
    // 访问方式1
    list1.foreach((x: Int) => {
      print(x + " ")
    })
    
    // 访问方式2
    val it: Iterator[Int] = list1.iterator
    while (it.hasNext) {
      print(it.next + " ")
    }

  }

建议

建议:在操作集合的时候,不可变集合的增删改查变用符号,可变集合的增删改查变用方法

<think>我们正在讨论TI微控制器中的DL_GPIO_readPins函数,该函数用于读取一组GPIO引脚的状态。函数原型通常如下: uint32_t DL_GPIO_readPins(GPIO_Regs *gpio, uint32_t pins); 其中,pins参数是一个位掩码,指定要读取的引脚。例如,要读取A24、A25、A26、A27四个引脚,我们需要构造一个掩码,其中这些引脚对应的位被置1。 在TI的微控制器中,每个GPIO引脚都有一个对应的位位置。通常,引脚编号(如A24)中的数字24就代表该引脚在GPIO端口寄存器中的位位置。因此: - A24对应的位是第24位 - A25对应的位是第25位 - A26对应的位是第26位 - A27对应的位是第27位 所以,当我们调用DL_GPIO_readPins函数时,我们传入一个掩码,该掩码在24、25、26、27位上置1。掩码可以这样构造: mask = (1 << 24) | (1 << 25) | (1 << 26) | (1 << 27) 函数返回一个uint32_t类型的值,其中每一位对应一个引脚的状态(1表示高电平,0表示低电平)。因此,在返回的变量read中: - 第24位(从0开始计数)表示A24的状态 - 第25位表示A25的状态 - 第26位表示A26的状态 - 第27位表示A27的状态 注意:位的位置与引脚的编号一致,即A24对应第24位,A25对应第25位,以此类推。 因此,要提取每个引脚的状态,我们可以使用位操作: - A24的状态:`(read >> 24) & 1` - A25的状态:`(read >> 25) & 1` - A26的状态:`(read >> 26) & 1` - A27的状态:`(read >> 27) & 1` 或者,我们可以分别检查read变量的第24、25、26、27位。 例如: ```c uint32_t read = DL_GPIO_readPins(gpio, mask); if (read & (1 << 24)) { // A24为高电平 } else { // A24为低电平 } // 同样处理其他引脚 ``` 或者使用宏定义来简化: ```c #define A24_MASK (1 << 24) #define A25_MASK (1 << 25) #define A26_MASK (1 << 26) #define A27_MASK (1 << 27) uint32_t mask = A24_MASK | A25_MASK | A26_MASK | A27_MASK; uint32_t read = DL_GPIO_readPins(gpio, mask); if (read & A24_MASK) { // A24高 } // ... 其他类似 ``` 总结:在返回的read变量中,A24、A25、A26、A27分别位于第24、25、26、27位(从0开始计数,即最低位为0)。 注意:这里假设引脚的编号与位位置一一对应,且GPIO端口的寄存器是32位的,每个引脚占据一位。TI的微控制器通常如此。 根据引用[3]中的示例代码,他们使用DL_GPIO_readPins读取单个引脚(KEY_PIN_18_PIN)时,也是通过检查返回值的非零来判断高电平。但注意,当读取多个引脚时,返回值是一个位域,每个引脚的状态在对应的位上。 因此,用户的问题:这四个引脚的值在read变量中的位置就是它们各自的引脚编号所对应的位位置(即24,25,26,27)。</think>在TI微控制器中,使用`DL_GPIO_readPins()`函数读取GPIO引脚状态时,返回的`uint32_t read`变量中,**引脚状态按引脚编号对应的位位置存储**。具体到A24-A27引脚: 1. **位位置映射** 每个GPIO引脚在返回值中占据固定位位置,映射关系为: - **A24** → 第24位(从0开始计数,即 `1 << 24`) - **A25** → 第25位(`1 << 25`) - **A26** → 第26位(`1 << 26`) - **A27** → 第27位(`1 << 27`) 2. **状态提取方法** 通过位掩码和移位操作获取各引脚状态: ```c uint32_t read = DL_GPIO_readPins(GPIOA, A24_MASK | A25_MASK | A26_MASK | A27_MASK); // 提取单个引脚状态(1=高电平,0=低电平) uint8_t a24_state = (read >> 24) & 0x01; // A24状态 uint8_t a25_state = (read >> 25) & 0x01; // A25状态 uint8_t a26_state = (read >> 26) & 0x01; // A26状态 uint8_t a27_state = (read >> 27) & 0x01; // A27状态 ``` 3. **掩码定义建议** 最佳实践是使用预定义掩码: ```c #define A24_MASK (1 << 24) #define A25_MASK (1 << 25) #define A26_MASK (1 << 26) #define A27_MASK (1 << 27) ``` ### 验证示例 参考引用[3]的代码逻辑,读取多引脚时的位操作原理相同: ```c // 读取KEY_PIN_18(假设对应某位) if(DL_GPIO_readPins(KEY_PORT, KEY_PIN_18_PIN) > 0) { ... } ``` 当读取多个引脚时,返回值是**所有请求引脚状态的位或(bitwise OR)**,需通过位移分离各引脚状态[^3]。 ### 注意事项 - 引脚编号必须与硬件设计匹配,A24即对应位24 - 32位变量中,**高位(≥24)属于PORTA的高字节引脚**,需确保GPIO端口支持(如MSPM0的PORTA通常有32个引脚) - 若读取未启用的引脚,返回值中对应位为未定义状态
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值