当前位置: 首页 > news >正文

Android笔试面试题AI答之Kotlin(14)

文章目录

  • 64. Kotlin中定义函数还是属性场景?
      • 使用属性的场景
      • 使用函数的场景
      • 示例
  • 65. 阐述Kotlin中变量初始化有几种?其中lateinit、by lazy、delegates.notNull有什么区别 ?
      • Kotlin中变量初始化的几种方式
      • `lateinit`、`by lazy`、`Delegates.notNull`的区别
  • 66. Kotlin中的@Metadata注解介绍以及生成流程 ?
      • @Metadata注解的作用
      • @Metadata注解的生成流程
      • 注意事项
  • 67. Kotlin中的@Metadata运行时注解吗?
      • @Metadata注解的特点
      • 运行时注解的用途
      • 结论
  • 68. 阐述Kotlin中lambda表达式编译的流程 ?
      • 1. 语法分析
      • 2. 语义分析
      • 3. 生成中间表示(IR)
      • 4. 字节码生成
      • 5. 字节码优化
      • 6. 运行时支持
      • 总结

64. Kotlin中定义函数还是属性场景?

在Kotlin中,定义函数(Function)还是属性(Property)主要取决于你想要表达的行为或数据的本质。下面是几种常见的场景,帮助你决定是使用函数还是属性:

使用属性的场景

  1. 数据封装:当你需要封装类的内部状态,并希望提供对这些状态的访问时,通常应该使用属性。属性可以是val(只读)或var(可读写),具体取决于你是否希望外部能够修改这个值。

  2. 简单数据访问:如果某个值只是简单地被读取或偶尔更新,并且这个值的获取或更新不涉及复杂的逻辑或副作用(如IO操作、网络请求等),那么使用属性可能更为合适。

  3. 性能考虑:对于频繁访问的数据,如果每次访问都需要执行计算或调用函数,可能会影响性能。在这种情况下,将这些数据存储在属性中可能更有效率。

使用函数的场景

  1. 复杂逻辑:如果值的获取或设置涉及到复杂的逻辑,或者需要根据当前状态动态计算值,那么使用函数可能更为合适。函数可以封装这些逻辑,并保持类的简洁性。

  2. 副作用:如果获取或设置值的过程中需要执行某些副作用(如更新UI、写入文件、发送网络请求等),那么应该使用函数而不是属性。这有助于明确这些操作可能带来的后果。

  3. 延迟初始化:如果你希望某个值在首次被访问时才进行计算或初始化,那么可以定义一个返回该值的函数,并在函数体内进行初始化。这种方式被称为“懒加载”或“延迟初始化”。

  4. 依赖其他状态:如果某个值的获取依赖于类的其他状态,并且这些状态可能会变化,那么使用函数来动态计算这个值可能更为合适。这样,每次访问这个值时都会基于最新的状态进行计算。

示例

属性示例

class Person {var name: String = ""val age: Int = 30 // 假设年龄是不可变的
}

函数示例

class Person {private var _name: String = ""var name: Stringget() = _nameset(value) {// 这里可以添加复杂的逻辑或副作用_name = value.trim()}fun getFullNameWithTitle(): String {// 假设全名的获取涉及复杂逻辑return "Mr. $name"}
}

在上面的示例中,name属性提供了对_name字段的封装,并允许在设置值时执行一些简单的逻辑(如去除空白字符)。而getFullNameWithTitle函数则封装了获取全名并添加称谓的复杂逻辑。

65. 阐述Kotlin中变量初始化有几种?其中lateinit、by lazy、delegates.notNull有什么区别 ?

在Kotlin中,变量初始化是一个重要概念,它确保了变量在使用前已经被赋予了合适的值。Kotlin对变量初始化有严格的要求,特别是非空类型(Non-nullable types)的变量,必须在声明时或构造函数中进行初始化。下面我将详细阐述Kotlin中变量初始化的几种方式,并重点解释lateinitby lazy、以及Delegates.notNull的区别。

Kotlin中变量初始化的几种方式

  1. 直接在声明时初始化
    这是最常见的初始化方式,适用于在变量声明时就能确定其值的情况。

    val a: Int = 10
    var b: String = "Hello, Kotlin!"
    
  2. 在构造函数中初始化(对于类的成员变量):
    如果变量是类的成员变量,并且其类型不是可空的(即没有?后缀),则必须在构造函数中或通过初始化块进行初始化。

    class MyClass {val myValue: Stringinit {myValue = "Initialized in init block"}// 或者在构造函数中constructor(value: String) {myValue = value}
    }
    
  3. 使用lateinit关键字
    对于var类型的变量,如果它们不能在声明时初始化,并且需要在对象构造之后但在首次使用之前被初始化,可以使用lateinit关键字。注意,lateinit仅适用于var变量且其类型不能为可空类型。

    lateinit var myLateInitString: String// 在某个方法中初始化
    fun init() {myLateInitString = "Initialized later"
    }
    
  4. 使用by lazy委托
    by lazy提供了一种懒加载的方式,它确保变量只会在第一次被访问时初始化,并且只初始化一次。这对于计算开销大或只在某些条件下需要的对象特别有用。

    val myLazyString: String by lazy {println("Initializing myLazyString")"Hello from lazy"
    }
    
  5. 使用Delegates.notNull
    Delegates.notNull是Kotlin标准库中的一个委托属性,它类似于lateinit,但提供了更多的灵活性,比如可以在setter中执行额外的逻辑。然而,需要注意的是,Delegates.notNull并不是Kotlin官方推荐的主要用于替代lateinit的方式,它更多是作为委托属性模式的一个例子。

    import kotlin.properties.Delegatesvar myNotNullString: String by Delegates.notNull<String>()fun initString() {myNotNullString = "Initialized by Delegates.notNull"
    }
    

lateinitby lazyDelegates.notNull的区别

  • lateinit

    • 适用于var类型变量。
    • 变量不能是可空的。
    • 必须在对象构造之后但在首次访问前进行初始化。
    • 初始化后,变量保持其非空性。
  • by lazy

    • 适用于valvar类型变量。
    • 提供了懒加载功能,即只在第一次访问时初始化。
    • 可以用于可空或不可空类型。
    • 初始化后的值在后续访问中保持不变。
  • Delegates.notNull

    • 提供了类似lateinit的功能,但更灵活。
    • 允许在setter中执行额外的逻辑。
    • 并非官方推荐的主要替代lateinit的方式,更多是作为委托属性模式的一个例子。
    • 类似于lateinit,但支持更复杂的场景。

总结来说,选择哪种初始化方式取决于你的具体需求,包括变量的类型(valvar)、是否需要懒加载、以及是否需要在setter中执行额外逻辑等因素。

66. Kotlin中的@Metadata注解介绍以及生成流程 ?

在Kotlin中,@Metadata注解是一个非常重要的组成部分,它主要用于存储Kotlin编译器生成的关于Kotlin声明的元数据。这些元数据对于Kotlin和Java之间的互操作性尤为重要,因为它们允许Java代码理解Kotlin代码的结构,如属性、默认参数、空安全等特性。

@Metadata注解的作用

  • 提供Kotlin声明的元信息:包括类、函数、属性等的名称、类型参数、泛型信息、构造函数、属性访问器(getter/setter)等。
  • 支持Kotlin特性在Java中的表示:例如,Kotlin的属性(property)在Java中通常被表示为一个私有字段加上getter和setter方法(如果有的话),但@Metadata注解使得Kotlin编译器能够将这些属性作为Java中的字段直接访问(通过Kotlin反射API或Kotlin插件)。
  • 促进Kotlin和Java之间的互操作:使得Kotlin库能够被Java项目无缝使用,同时也使得Java库在Kotlin项目中能够更好地被理解和使用。

@Metadata注解的生成流程

  1. Kotlin代码编译:当Kotlin代码被编译时,Kotlin编译器会分析源代码,并构建出对应的AST(抽象语法树)。

  2. 元数据处理:编译器在构建AST的过程中,会收集关于Kotlin声明的所有必要信息,如类名、方法签名、属性类型等。

  3. 生成@Metadata注解:基于收集到的元数据信息,编译器会生成一个@Metadata注解,并将其添加到编译生成的Java字节码中。这个注解通常会被添加到Kotlin声明的对应Java类、接口或方法的注解列表中。

  4. Java字节码生成:除了@Metadata注解之外,Kotlin编译器还会将Kotlin代码转换为Java字节码。这个过程中,Kotlin的特性(如属性、空安全等)会被转换为Java能够理解的形式。

  5. 互操作:在运行时,Kotlin的反射API或其他工具(如Kotlin的Java插件)可以利用@Metadata注解中的信息来理解和操作Kotlin对象,从而实现Kotlin和Java之间的无缝互操作。

注意事项

  • @Metadata注解是Kotlin编译器自动生成的,开发者通常不需要手动编写或修改它。
  • 由于@Metadata注解包含了大量的元数据信息,因此在某些情况下(如使用Kotlin编译的库非常庞大时),它可能会增加编译生成的Java字节码的大小。
  • 对于Kotlin和Java之间的互操作,了解@Metadata注解的工作原理和它所包含的信息是非常重要的,但通常情况下,开发者不需要直接处理这些信息,而是依赖于Kotlin编译器和运行时库来自动处理。

67. Kotlin中的@Metadata运行时注解吗?

Kotlin中的@Metadata注解在运行时是可见的,但它主要用于编译时和反射时的信息提供,而不是直接用于运行时逻辑。

@Metadata注解的特点

  1. 自动生成@Metadata注解是由Kotlin编译器自动生成的,它包含了Kotlin源代码的元数据,如类名、方法签名、属性类型等。
  2. 运行时可见:尽管@Metadata注解主要用于编译时和反射时的信息提供,但由于它通常被设置为@Retention(RetentionPolicy.RUNTIME),因此它在运行时也是可见的。这意味着你可以通过反射机制在运行时读取@Metadata注解中的信息。
  3. 反射支持:Kotlin的反射API依赖于@Metadata注解中的信息来理解和操作Kotlin对象。例如,通过Kotlin反射API,你可以获取类的属性、方法、构造函数等信息,这些信息通常是通过解析@Metadata注解中的元数据得到的。

运行时注解的用途

在Java和Kotlin中,运行时注解(即@Retention(RetentionPolicy.RUNTIME)注解)的主要用途包括:

  • 反射:通过反射机制在运行时读取注解信息,以执行某些操作,如依赖注入、配置解析等。
  • 动态代理:在创建动态代理时,可以根据注解信息来生成代理类的实现。
  • 运行时检查:在运行时检查类或方法上是否存在某个注解,以决定是否执行特定的逻辑。

结论

综上所述,Kotlin中的@Metadata注解在运行时是可见的,并且它是Kotlin反射API和Kotlin与Java之间互操作性的重要组成部分。然而,需要注意的是,@Metadata注解的主要用途是提供编译时和反射时的信息,而不是直接用于运行时逻辑。在大多数情况下,开发者不需要直接处理@Metadata注解中的信息,而是依赖于Kotlin编译器和运行时库来自动处理这些信息。

68. 阐述Kotlin中lambda表达式编译的流程 ?

Kotlin中的lambda表达式编译流程是一个复杂但高效的过程,它允许开发者以简洁的方式编写函数式代码。以下是lambda表达式编译流程的一个概述:

1. 语法分析

首先,Kotlin编译器会对源代码中的lambda表达式进行语法分析。Lambda表达式在Kotlin中通常表示为{ 参数列表 -> 函数体 }的形式。编译器会检查lambda表达式的语法是否正确,包括参数列表的声明、箭头符号->的使用以及函数体的编写。

2. 语义分析

在语法分析之后,编译器会进行语义分析,以确定lambda表达式的含义。这包括类型检查、作用域解析等步骤。编译器会确定lambda表达式中每个参数的类型、函数体的返回类型以及可能抛出的异常类型等。

3. 生成中间表示(IR)

Kotlin编译器会将lambda表达式转换为一个中间表示(Intermediate Representation, IR),这是编译过程中的一个关键步骤。中间表示是一种与平台和语言无关的代码形式,它允许编译器进行更复杂的优化和分析。在这个阶段,lambda表达式会被转换为一个或多个函数或方法,这些函数或方法将被包含在生成的字节码中。

4. 字节码生成

接下来,编译器会将中间表示转换为Java字节码(.class文件)。对于lambda表达式,Kotlin编译器通常会生成一个或多个匿名内部类来实现lambda表达式的功能。这些匿名内部类会继承Kotlin标准库中的某个Lambda接口(如FunctionN),并实现其invoke方法。Lambda接口的选择取决于lambda表达式中参数的数量和类型。

5. 字节码优化

在生成字节码之后,Kotlin编译器还会对其进行优化,以提高执行效率。这些优化可能包括内联函数、消除冗余代码、优化循环等。对于lambda表达式,编译器可能会尝试将其内联到调用点,以减少方法调用的开销。

6. 运行时支持

最后,当Kotlin程序运行时,JVM(Java虚拟机)会加载并执行编译生成的字节码。对于lambda表达式生成的匿名内部类,JVM会创建其实例并调用其invoke方法。Kotlin运行时库还提供了对lambda表达式的额外支持,如函数式接口的实现、集合的函数式API等。

总结

Kotlin中的lambda表达式编译流程包括语法分析、语义分析、生成中间表示、字节码生成、字节码优化以及运行时支持等步骤。这个流程允许Kotlin编译器将lambda表达式转换为高效的字节码,从而支持函数式编程范式在Kotlin中的广泛应用。需要注意的是,具体的编译流程可能会根据Kotlin编译器的版本和设置而有所不同。

答案来自文心一言,仅供参考

相关文章:

Android笔试面试题AI答之Kotlin(14)

文章目录 64. Kotlin中定义函数还是属性场景?使用属性的场景使用函数的场景示例 65. 阐述Kotlin中变量初始化有几种?其中lateinit、by lazy、delegates.notNull有什么区别 &#xff1f;Kotlin中变量初始化的几种方式lateinit、by lazy、Delegates.notNull的区别 66. Kotlin中…...

博弈论,CF 1600E - Array Game

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1600E - Array Game 二、解题报告 1、思路分析 记最长递增前缀长度为L&a…...

win10安装docker,打包python、java然后centos执行镜像

一、win10安装Docker Desktop docker官网&#xff08;需要魔法&#xff09;下载&#xff1a;https://www.docker.com/products/docker-desktop/ 安装方法参考&#xff1a;https://blog.csdn.net/beautifulmemory/article/details/137970794 下载完毕后界面安装&#xff0c;不勾…...

【数据结构入门】二叉树之堆的实现

文章目录 前言一、树1.1 树的概念1.2 树的相关概念 二、二叉树2.1 二叉树的概念2.2 特殊的二叉树2.3 二叉树的性质 三、堆3.1 堆的概念3.2 堆的性质3.3 堆的存储3.4 堆的实现3.4.1 堆的初始化3.4.2 堆的销毁3.4.1 堆向上调整算法3.4.2 堆向下调整算法3.4.3 堆的创建3.4.4 堆的插…...

智能微气候:精准调控背后的算法革命

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;当人工智能遇见现代农业,会擦出怎样的火花?随着数字农业、智慧农业的蓬勃发展,人工智能技术正以前所未有的速度渗透到农业生产的方方面面。其中,以深度学习为代表的前沿算法,尤其是大语言模型(LLM),正在成为驱…...

eNSP 华为交换机链路聚合

华为交换机链路聚合 链路聚合好处&#xff1a; 1、提高带宽 2、链路冗余 SW_2&#xff1a; <Huawei>sys [Huawei]sys SW_2 [SW_2]vlan batch 10 20 [SW_2]int g0/0/4 [SW_2-GigabitEthernet0/0/4]port link-type access [SW_2-GigabitEthernet0/0/4]port default vl…...

编译器揭秘

从上世纪50年代开始&#xff0c;编程语言五花八门&#xff0c;编译器和解释器层出不穷。此处只列出常见编程语言的编译器和解释器信息&#xff0c;不常见的编程语言有单独文章介绍。 C/C cc 此处代表Unix C编译器&#xff0c;其他平台可能借用cc软链接到真正的C编译器。MSVC 微…...

ubuntu下qt连接mysql出现 QMYSQL driver not loaded

1、首先检查是否重新安装了MySQL的驱动&#xff0c;可以使用命令&#xff1a; sudo apt-get remove libqt5sql5-mysql sudo apt-get install libqt5sql5-mysql 2、重新安装ibmysqlclient-dev即可解决 sudo apt-get remove libmysqlclient-dev sudo apt-get install libmysq…...

html 首行缩进2字符

1. html 首行缩进2字符 1.1. 场景 在Html开发中让一段文字&#xff08;富文本等&#xff09;首行缩进两个文字&#xff0c;可能在前面加上8个“ ”&#xff0c;因为过去对CSS不熟悉&#xff0c;这种方法实现虽然比较直接&#xff0c;但是文字多的时候会有很多“ ”充斥在代码中…...

什么是IP?

目录 简介 IP IP协议 IP地址 发展历程 IP地址类型 公有地址 私有地址 IP地址编址方式 A类IP地址 B类IP地址 C类IP地址 D类IP地址 特殊的网址 子网 超网 无类间路由 IP地址的分配 IP地址管理 手工管理模式 DHCP分配IP地址的管理模式 通过交换机管理IP 地址…...

js拖拽交换元素位置

摘要:最近在做会议系统,9宫格小画面要支持拖拽调整顺序,需求已经实现了,简单记录下当时的逻辑处理。 /* 关于拖拽逻辑处理 start */ // 当前在拖动的下标 const curDragIndex useRef<number>(-1); /* 拖拽元素事件* onDragStart_开始* onDragend_结束 */ const handleD…...

在 C++ 中实现自定义容器的实用指南

在 C 中实现自定义容器的实用指南 在 C 编程中&#xff0c;容器是存储和管理数据的基本工具。标准库提供了多种容器&#xff0c;如 std::vector、std::list 和 std::map&#xff0c;但在某些情况下&#xff0c;开发者可能需要实现自定义容器以满足特定需求。本文将详细介绍如何…...

《深入浅出WPF》读书笔记.4名称空间详解

《深入浅出WPF》读书笔记.4名称空间详解 背景 主要讲明名称空间概念&#xff0c;可以理解为命名空间的引用。 xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" &#x1f446;如x可以理解为一些列命名空间的引用。 不一一列举&#xff0c;只讲几个特殊的…...

电驱动总成

电驱动总成&#xff08;Electric Drive Assembly&#xff09;是电动汽车和混合动力汽车中关键的组成部分&#xff0c;主要负责将电能转化为机械能&#xff0c;以驱动汽车的轮胎。电驱动总成包括多个关键组件&#xff0c;通常可以分为以下几个主要部分&#xff1a; ### 主要组成…...

JavaScript class和正则

正则表达式练习 出生日期 年 月 日 ()表示一个整体 console.log(1909.match(^19\\d{2}$)); console.log(2024.match(^20(([01][0-9])|(2[0-4]))$)); //年 console.log(1909.match(^(19\\d{2})|(20(([01][0-9])|(2[0-4])))$)); // 月 console.log(12.match(^(0[1-9])|(1[0-2])…...

[Linux#42][线程] 锁的接口 | 原理 | 封装与运用 | 线程安全

互斥量 mutex • 大部分情况&#xff0c;线程使用的数据都是局部变量&#xff0c;变量的地址空间在线程栈空间 内&#xff0c;这种情况&#xff0c;变量归属单个线程&#xff0c;其他线程无法获得这种变量。 • 但有时候&#xff0c;很多变量都需要在线程间共享&#xff0c;这…...

奇异递归Template有啥奇的?

如果一个模版看起来很头痛&#xff0c;那么大概率这种模版是用来炫技&#xff0c;没啥用的&#xff0c;但是CRTP这个模版&#xff0c;虽然看起来头大&#xff0c;但是却经常被端上桌~ 奇异递归模板模式&#xff08;Curiously Recurring Template Pattern, CRTP&#xff09;是一…...

每天五分钟深度学习框架pytorch:神经网络工具箱nn的介绍

本文重点 我们前面一章学习了自动求导,这很有用,但是在实际使用中我们基本不会使用,因为这个技术过于底层,我们接下来将学习pytorch中的nn模块,它是构建于autograd之上的神经网络模块,也就是说我们使用pytorch封装好的神经网络层,它自动会具有求导的功能,也就是说这部…...

【办公软件】安全风险 Microsoft 已阻止宏运行,因为此文件的来源不受信任

Excel 2019版本&#xff0c;就出现安全风险 Microsoft 已阻止宏运行 因为此文件的来源不受信任的问题&#xff0c;宏直接就用不了了。 网上的解决方法&#xff0c;文件右键属性->取消安全锁。但存在没有安全锁这个选项。后查询到一个简单的解决方法。 打开Excel表格->文件…...

JavaScript语法基础之流程结构(顺序、选择、循环结构)

目录 1. 流程控制 1.1. 流程控制简介 1.1.1. 顺序结构 1.1.2. 选择结构 1.1.3. 循环结构 1.2. 选择结构&#xff1a;if 1.2.1. 单向选择&#xff1a;if… 1.2.2. 双向选择&#xff1a;if…else… 1.2.3. 多向选择&#xff1a;if…else_if…else… 1.3. 选择结构&#…...

集团数字化转型方案(四)

集团数字化转型方案通过全面部署人工智能&#xff08;AI&#xff09;、大数据分析、云计算和物联网&#xff08;IoT&#xff09;技术&#xff0c;创建了一个智能化的企业运营平台&#xff0c;涵盖从业务流程自动化、实时数据监控、精准决策支持&#xff0c;到个性化客户服务和高…...

【MySQL索引】索引失效场景

索引失效 1 全值匹配肯定不失效 2 最佳左前缀法则 索引文件具有 B-Tree 的最左前缀匹配特性&#xff0c;如果左边的值未确定&#xff0c;那么无法使用此索引。 3 主键插入顺序 页分裂&#xff0c;建议 让主键具有 AUTO_INCREMENT 4 计算、函数、类型转换(自动或手动)导致…...

基于MATLAB视觉的静态手势识别系统

一、课题介绍及思路 为了丰富手势识别方法的多样性&#xff0c;提高手势识别的正确率&#xff0c;提出了一种基于手势轮廓像素变化的手势识别方法。在Matlab环境下&#xff0c;设计并开发了一个基于视觉的静态手势识别系统。系统主要由两部分组成&#xff1a;手势分割与手势识…...

day02-作业题

一、简答题 请说出方法定义的全格式 访问修饰符 静态修饰符 返回值 方法名(参数列表){方法体;retrun 返回值;}请说出方法重载的概念 在一个类中&#xff0c;可以定义方法名相同&#xff0c;参数列表不相同(参数类型、参数个数或者参数顺序不同)的方法请简述什么是类&#xf…...

torch.cuda.set_divice()

我申请了两块GPU,然后看两张显卡的编号 import torch torch.cuda.set_device(0) # 设置当前cuda设备编号为1 print("当前cuda设备是", torch.cuda.current_device()) # 获取当前cuda设备import torch torch.cuda.set_device(1) …...

<数据集>RSOD数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;936张 标注数量(xml文件个数)&#xff1a;936 标注数量(txt文件个数)&#xff1a;936 标注类别数&#xff1a;4 标注类别名称&#xff1a;[aircraft, oiltank, overpass, playground] 序号类别名称图片数框数1air…...

企业高性能web服务器之Nginx

文章目录 Apache经典的web服务端Apache prefork 模型Apache work 模型&#xff08;适应市场&#xff09;Apache event 模型 网络I/O网络I/O模型I/O模型网络I/O模型 Nginx架构和安装Nginx源码编译环境准备安装nginx Nginx的平滑升级及版本回滚 Nginx架构和进程Nginx进程结构Ngin…...

11-sentinel利用nacos作持久化

本文介绍sentinel配置数据的持久化方法。由于sentinel官方并没有提供持久化功能&#xff0c;大家在测试过程中也能发现sentinel服务重启后&#xff0c;原来配置的数据就丢了&#xff0c;本文就是来处理这一问题的。 做好心理准备&#xff0c;我们要修改sentinel的源代码&#…...

密码学之哈希算法

文章目录 1. 哈希函数概述1.1 哈希函数的定义1.2 哈希函数的重要性 2. SHA系列算法简介2.1 SHA系列的发展历史2.2 SHA系列的应用场景 3. 主要SHA算法详解3.1 MD5算法3.2 SHA-1算法3.3 SHA-2算法家族3.4 SHA-3算法 4. SHA算法的安全性分析4.1 安全性的重要性4.2 已知的攻击方法4…...

杰发科技AC7801——GPIO通过寄存器地址控制高低电平

通过这个寄存器来查看控制的是哪个ODR值&#xff0c;使用sample&#xff0c;发现是0x20080068的第7和第9位 使用51控制寄存器的代码来置高置低代码&#xff0c;注意变量需要用unsigned int来声明 unsigned int ledBit 0;mdelay(100);ledBit | (1 << 9); ledBit & ~…...