首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

漫话:如何给女朋友解释为什么计算机0开始计数,不是1开始

当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式: for (int i=0; i<10; i++){ } 可以看到,为了保证循环10次,我们定义了一个整数变量0开始。...他认为,使用左闭右开的表达方式,当下标 1 开始时,下标范围为 1 <= i < N+1;当下标 0 开始时则是 0 <= i < N; 而显然后面这种表达式更加漂亮、优雅一些。...计数表示偏移量 很多人学习编程都是C语言开始的,那么,C语言就是一个典型的0-base语言(以0作为计数的开始),其实,这一约定早在BCPL时代就是这样的了。...在C语言还不叫C语言,还叫BCPL的时候,他的作者马丁·理察德就设计了数组0开始的索引方式。...开始的(1-based indexing),而对Python语言有巨大影响的另一门语言,C语言的索引则是0开始的。

98740

数组是如何随机访问元素?数组下标为什么0开始不是1?

例如:二叉树,堆,图,等,是非线性表,是因为,在非线性表中,数据之间并不是简单的前后关系。 数组是如何随机访问数组元素? 数组是如何实现根据下标随机访问数组元素的吗?...1,数组使用二分法查找元素,时间复杂度是O(logn)。 2,根据下标随机访问的时间复杂度是O(1)。...数组开头插入数据,所有的数据往后移一位,情况最差,时间复杂度为O(n) 。 每一位插入的概率一样,所以平均时间复杂度为 (1+2+...+n)/n=(1+n)/2=O(n)。...为什么数组要从 0 开始编号,不是1? 偏移角度理解a[0] 0为偏移量,如果1计数,会多出K-1。增加cpu负担。...为什么循环要写成 for(inti=0;i<3;i++)不是 for(inti=0;i<=2;i++)。

6.1K10
您找到你想要的搜索结果了吗?
是的
没有找到

单片机入门学习十三 STM32单片机学习十 通用定时器

在此对计数模式做一个解释 ①向上计数模式:计数器0计数到自动加载值(TIMx_ARR),然后重新0开始计数并且产生一个计数器溢出事件。...②向下计数模式:计数器自动装入的值(TIMx_ARR)开始向下计数到0,然后自动装入的值重新开始,并产生一个计数器向下溢出事件。...③中央对齐模式(向上/向下计数):计数器0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。 ?...1、通用计时器概述 通用计数器TIMx(TIM2~TIM5)定时器的特点包括: 位于低速的APB1总线上(APB1) 16 位向上向下向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT...PSC都要加1,因为这两个值是配置在寄存器中的,其实0开始计数,故要加1。

1.4K20

(十七)STM32——定时器

和 TIM5)向上向下向上/向下自动装载计数器(TIMx_CNT),注意:TIM9~TIM14 只支持向上(递增)计数方式。         ...计时器模式 通用定时器可以向上计数、向下计数、向上向下双向计数模式。 向上计数模式:计数器0计数到自动加载值(TIMx_ARR),然后重新0开始计数并且产生一个计数器溢出事件。...向下计数模式:计数器自动装入的值(TIMx_ARR)开始向下计数到0,然后自动装入的值重新开始,并产生一个计数器向下溢出事件。...中央对齐模式(向上/向下计数):计数器0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。         ...我们通俗一来理解,以加载值为100为例子,向上计数模式就是0数到100,产生一个信号,再次0开始向下计数模式就是100数到0,产生一个信号,再次100开始中央对齐,就是0数到99,产生一个信号

70310

【STM32】HAL库 STM32CubeMX教程六—-定时器中断

基本定时器功能(TIM6、TIM7): 16位向上向下向上/下自动装载计数器 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 触发DAC的同步电路...位于APB1总线上 通用定时器(TIM2~TIM5)的主要功能: 16位向上向下向上/下自动装载计数器 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值...向上计数模式:计数器0计数到自动加载值(TIMx_ARR),然后重新0开始计数并且产生一个计数器溢出事件。...向下计数模式:计数器自动装入的值(TIMx_ARR)开始向下计数到0,然后自动装入的值重新开始,并产生一个计数器向下溢出事件。...中央对齐模式(向上/向下计数):计数器0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

2.2K30

STM32定时器US延时

CNT计数器的范围为0~65535,可以向上计数、向下计数或向上/向上双向计数。当计数值达到设定值时,会产生溢出事件,发出中断或DMA请求,然后再由自动装载寄存器进行重新加载或更新。...1us; 21行:设置定时器计数方式,支持五种计数方式: 向上计数模式(TIM_COUNTERMODE_UP):计数器0向上计数(递增)到自动装载值ARR,随后再次回到0开始计数,并产生一个计数器向上溢出事件...向下计数模式(TIM_COUNTERMODE_DOWN):计数器自动装载值ARR向下计数(递减)到0, 随后再次回到自动装载值开始计数,并产生一个计数器向下溢出事件; 中央对齐模式1/2/3...计数器(TIM_COUNTERMODE_CENTERALIGNED1/2/3):计数器0开始计数到自动装载值ARR-1,并产生一个计数器溢出事件,而后再向下计数到0+1,并产生一个计数溢出事件,随后再向上计数...0到t开始计数,使用“__HAL_TIM_GET_COUNTER()”获取当前CNT计数器的值,当CNT计数器的值等于t时,时间经历了0到t个1us,实现了延时t us; 18行:停止定时器,无需自动重新装填

1.2K20

定时器的PWM输出与输入捕获

STM32F1的通用定时器TIMx (TIM2-TIM5)具有如下功能: (1)16 位向上向下向上/向下自动装载计数器(TIMx_CNT)。...(5)发生如下事件时产生中断/DMA请求: A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) C.输入捕获...(1)PWM边沿对齐模式 当 TIMx_CR1 寄存器中的 DIR 位为低时执行递增计数,计数器CNT 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新 0 开始计数并生成计数器上溢事件...开始的时候, 计数器CNT 0 开始计数到自动重载值减 1(ARR-1),生成计数器上溢事件;然后自动重载值开始向下计数到 1 并生成计数器下溢事件。之后 0 开始重新计数。...简言之,当前状态为低电平时,次高位置0,当前状态因发生捕获变为高电平时置1,发生下一次捕获变为低电平时再置0,同时最高位置1表示已经完成了一次捕获。 下面用流程图来表示中断函数实现思路。

2.9K40

Vue 中的 Props 与 Data 细微差别,你知道吗?

在本文中,我们将学习到: 什么是props,为什么这些数据只向下流动,不是向上 data 选项的用途 响应式是什么 如何避免 props 和 data 之间的命名冲突 如何将 props 和 data...类似于家谱,具有: 父母 孩子 祖先 子孙 数据根组件(位于最顶端的组件)沿着树向下流动。就像基因是如何代代相传的一样,父组件也会将自己的props传给了他们的孩子。...但是出于同样的原因,这样做是非常糟糕的 如果需要向组件传递数据,可以使用props向下传递数据(传递给子组件),或者使用事件向上传递数据(传递给父组件)。...避免命名冲突 Vue所做的另一件事是,使开发工作变得更好一。...我们将数据保存在ProfilePage不是ContactInfo中的原因是ProfilePage页面的其他部分需要访问user对象。

3.3K10

stm32cubemx使用教程pdf_库乐队完全新手教程

其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出 原理讲解: 下图为向上计数模式: 在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/...PWM的一个周期 定时器0开始向上计数 当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平 t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平...,通过比较结果输出高低电平,便可以实现脉冲宽度调制模式(PWM信号) TIMx_ARR寄存器确定PWM频率, TIMx_CCRx寄存器确定占空比 详解: 若配置脉冲计数器TIMx_CNT为向上计数,重载寄存器...如果初学者,看标注的红色字体,就大体可以理解 PWM的工作模式: PWM模式1(向上计数) :计数器0计数加到自动重装载值(TIMx_ARR),然后重新0开始计数,并且产生一个计数器溢出事件...PWM模式2(向下计数) :计数器自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件 设置寄存器TIMx_CCMR1的OC1M[

62710

系统中断实时性测试方法

上下文则是当前的线程的执行状态,更加准确的说就是处理器相关的寄存器。比如对于cortex-m系列处理器来说,则保存R0~R15和xPSR寄存器。然后通过SP的偏移将寄存器压入栈内存中。...此时又可以从打断的地方开始执行了,这就是一个中断处理过程的基本流程。 系统的中断响应时间指的是什么? ?...由于处理器的设计,响应时间无法完全的做的立即进入中断处理函数,此时从中断的产生,到中断函数处理的这个过程就是中断响应时间,文字描述就是硬件响应+硬件压栈+软件压栈。 3.那么这段时间如何测试?...原理上是开启两个计数器,一个是向上递增的计数器,另外一个是向下递减的计数器。递减的计数器当一直递减到0时,产生中断。 暂时定义为这两个定时器为timer1和timer2。 ?...在某一个时间,同时设置timer1倒计时2s,并且记录此时timer的计数1,cnt1。

2K40

【盟友分享】vim学习之路-vim基本操作

前言:说到我的学习之路是arm嵌入式开发开始的,基本上在学校学习都时windows开发开始的,转到ubuntu上嵌入式开发刚开始非常的不习惯。...不用鼠标很难受的,大家是不是有同感,不过在我接触学习vim后我的看法彻底被改变了。我就以我的学习经历从一个新手开始,一步一步的为大家带来我的vim学习之路。 如果你不是开始学习vim请略过此段。...,]函数结束(c文件有效) % 跳到匹配的括号处 滚屏操作: CTRL-U使文本向下滚动半屏。...相当于显示文本的窗口向上滚半屏。光标所处的行数随滚屏改变。 CTRL-D使文本向上滚动半屏。相当于显示文本的窗口向下滚半屏。光标所处的行数随滚屏改变。 CTRL-E使文本向上滚动一行。...CTRL-Y使文本向下滚动一行。光标所处的行数不变。 CTRL-F 向前滚动一整屏。滚动后光标处于第一行。 CTRL-B向后滚动一整屏。滚动后光标处于最后一行。 zz把当前位置处于屏幕的正中央。

2K60

STM32 看门狗详解

,看门狗功能由 VDD 电压域供电,所以在停止模式和待机模式下仍能工作 向关键字寄存器(IWDG_KR)写入0XCCCC,独立看门狗就会启动,计数器开始下降复位值0XFFF。...这意味着必须在限定的时间窗口内刷新计数器 2.2 窗口看门狗主要特点 ①可编程自由向下计数器 ②复位条件,激活看门狗的情况下,当递减计数器值小于 0x40 时复位;在窗口之外重载递减计数器时复位。...③提前唤醒中断 (EWI):当递减计数器等于 0x40 时触发(如果已使能且看门狗已激活) 2.3 窗口看门狗功能说明 如果窗口看门狗启动(WWDG_CR寄存器的WDGA位置1),7位向下计数器0X40...控制向下计数器 递减计数器处于自由运行状态:即使禁止看门狗,递减计数器继续递减计数。...DBG模块中的DBG_WWDG_STOP配置位选择继续正常工作或者停止工作 3、区别 应用场景不同 IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合

76210

Java Review - 并发编程_ 回环屏障CyclicBarrier原理&源码剖析

之所以叫作屏障是因为线程调用await方法后就会被阻塞,这个阻塞就称为屏障,等所有线程都调用了await方法后,线程们就会冲破屏障,继续向下运行。...一开始计数器值为2,当第一个线程调用await方法时,计数器值会递减为1。 由于此时计数器值不为0,所以当前线程就到了屏障被阻塞。...现在计数器值为0,这时就会去执行CyclicBarrier构造函数中的任务,执行完毕后退出屏障,并且唤醒被阻塞的第二个线程,这时候第一个线程也会退出屏障继续向下运行。...由此可见多个线程之间是相互等待的,假如计数器值为N,那么随后调用await方法的N-1个线程都会因为到达屏障被阻塞,当第N个线程调用await后,计数器值为0了,这时候第N个线程才会发出通知唤醒前面的...也就是当全部线程都到达屏障时才能一块继续向下执行 对于这个例子来说,使用CountDownLatch也可以得到类似的输出结果。下面再举个例子来说明CyclicBarrier的可复用性。

23910

【算法】二叉查找树(BST)实现字典API

【注意】 为了让代码尽可能简单, 我将字典的Key和Value的值也设置为int类型,不是对象, 所以在下面代码中, 处理“操作失败”的情况的时候,是返回 -1 不是返回 null 。...put方法 put方法的实现思路和get方法相似 根结点root开始,比较给定key和当前结点的键大小关系 key小于当前结点的键,向左子树插入 key大于当前结点的键,向右子树插入 key等于当前结点的键...递归调用前代码先执行, 递归调用后代码后执行 递归调用前代码是一个“沿着树向下走”的过程,即递归层次是由浅到深, 递归调用后代码是一个“沿着树向上爬”的过程, 即递归层次是由深到浅 如图 ?...图中可以看出, 整体的过程: 先“沿着树向下走”, 插入或更新结点 再“沿着树向上爬”, 更新结点计数器N min,max方法 min方法 由结点键间的大小关系可知, 键值最小的结点也就是整棵树中位于最左端的结点...所以我们的思路是: 根结点开始, 不断向当前结点的左儿子递归,直到左儿子为空时,返回当前结点的键值, 此时的键值就是所有键值中的最小值 ?

1.6K90

(45) 神奇的堆 计算机程序的思维逻辑

下面的这几个则都不是完全二叉树: ? 编号与数组存储 在完全二叉树中,可以给每个节点一个编号,编号1开始连续递增,从上到下,从左到右,如下图所示: ?...最大堆/最小堆 堆逻辑概念上是一颗完全二叉树,物理存储上使用数组,除了这两,堆还有一定的顺序要求。...基本思路是,最后一个非叶子节点开始,一直往前直到根,对每个节点,执行向下调整siftdown。...这个构建的时间效率为O(N),N为节点个数,具体就不证明了。 查找和遍历 在堆中进行查找没有特殊的算法,就是数组的头找到尾,效率为O(N)。...但在Java中,堆到底是如何实现的呢?本文开头提到的那些问题,用堆到底如何解决呢?让我们在接下来的几节中继续探索。

1.1K90

CS162操作系统课程第二课-4个核心OS概念

;魔术师是指我们要让它看起来像我们有一套非常干净易用的资源的抽象,不是使用实际的没有统一接口的物理资源。...但它们都可以在你当前的处理器上使用,那么它是如何工作的呢? 让我们假设只有一个物理处理器上只有一个核,在任何给定的时间在硬件上只有一个执行线程。...,当函数返回时,你把它们栈中取出,栈指针向上移动。...但它们都可以在你当前的处理器上使用,那么它是如何工作的呢? 让我们假设只有一个物理处理器上只有一个核,在任何给定的时间在硬件上只有一个执行线程。...,当函数返回时,你把它们栈中取出,栈指针向上移动。

42720

电机控制基础3——定时器编码器模式使用与转速计算

如下图,电机正转时,编码器的通道A(TI1)的信号超前通道B,计数器向上计数,反转时,通道A的信号滞后,向下计数。 ? 设置信号的极性反相,可以使向下计数代表电机正转。 ?...100:复位模式––在出现所选触发输入 (TRGI) 上升沿时,重新初始化计数器并生成一个寄存器更新事件。 101:门控模式––触发输入 (TRGI) 为高电平时使计数器时钟。...3.1.2 电机反转(向下计数) 反转的情况,编码的通道A的信号比通道B滞后1/4个周期: 通道A下降沿,通道B为低电平,向上计数,代表电机反转 通道A上升沿,通道B为高电平,向上计数,代表电机反转 ?...这里还以电机正转为例*: 观察下图,编码器在开始阶段可依次捕获到:通道A上升沿、通道B上升沿、通道A下降沿、通道B下降沿,所以有: 通道A上升沿,通道B为低电平,向上计数,代表电机正转 通道B上升沿,通道...另外,这里通过将CNT的uint32类型的计数值, 转为int16类型,就可以利用正负来区分上个100ms电机整体的转动方向(正转CNT0向上计数,转为int16还是正值;反转CNT0向下计数,会溢出

2.3K22

还不会JVM,是准备家里蹲吗?

如下图:向上级委托检查是否加载,上级自顶向下优先去加载类。 ?...直接指针 若直接使用指针访问,堆的布局中就要考虑如何放在访问类型数据的相关信息,reference中存储的直接就是对象的地址。 ?...可达性分析算法 基本思想时通过一系列称为GC Roots的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连的话,则证明此对象时不可用的。...Parallel Scavenge收集器 类似ParNew收集器,只不过关注是吞吐量(高效利用CPU),ParNew关注是用户体验(停顿时间)。...具有以下4个特点: ①并行与并发:使用多个CPU缩短停顿时间,可以并发方式让Java程序继续运行。 ②分代收集:虽不需其他收集器配合,但仍保留了分代。

29340

STM32Cube-12 | 使用通用定时器产生PWM驱动蜂鸣器

STM32L431 的通用 TIMx (TIM2、TIM15、TIM16)定时器功能包括: 16 位(TIM15,TIM16)/32 位(TIM2)向上向下向上/向下自动装载计数器,注意: TIM15...、TIM16 只支持向上(递增)计数方式; 16 位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为 1~65535 之间的任 意数值; 4 个独立通道(TIMx_CH1~4, 其中 TIM15...最多 2 个通道, TIM16 最多 1 个 通道); 这些通道可以用来作为: 输入捕获 输出比较 PWM 生成(边缘或中间对齐模式) 单脉冲模式输出 如下事件发生时产生中断/DMA: 更新:计数器向上溢出.../向下溢出,计数器初始化(通过软件或者内部/外部触发) 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 输入捕获 输出比较 ?...至此,我们已经学会如何使用通用定时器产生PWM驱动蜂鸣器,下一节将讲述如何使用硬件IIC接口读写EEPROM。

1.2K20
领券