定点数,定点数二维向量,定点数三维向量,定点数数学类

定点数,定点数二维向量,定点数三维向量,定点数数学类

  • 介绍
  • 浮点数
  • 定点数
  • 封装的定点数FixedNumber
  • 定点数二维向量
  • 定点数三维向量
  • 定点数数学类
  • 总结

介绍

众所周知定点数是用于做帧同步时保持不同cpu不同设备保持一致稳定的代替浮点数的变量,这里提供了之前封装好的定点数、定点数二维向量、定点数三位向量、定点数数学类。这里不是物理库,知识定点数变量。
定点数类库

浮点数

浮点数也就是float占用4个字节,而定点数是8long类型占用8个字节。不同的cpu机器在计算浮点数的时候都会有微小的差错,比如unity面板中设置一个对象的位置Position,有时候你输入的是一个整数,后来变成了接近你这个整数的.99或者.998等(用Unity时间久的应该是能感受到)。这是因为你输入之后cpu是要经过计算显示出来的。那么这种情况下我们在做帧同步的时候每个机型不一样,计算出来的float也会有差别,帧同步中有微乎其微的差别计算到最后也会是巨大的差别,会影响整个比赛的结果。

定点数

定点数通常使用long类型来计算,这里说明一下为什么是long类型,比如说一个浮点数9.988879,那么定点数可以这样标识,前4个字节记录9988879、后4个字节记录小数点(.)在第几位,最后拼接成我们想要的结果,这样就能保证不同的机器中运算结果一致。

封装的定点数FixedNumber

具体的使用方式其实跟Int float差不太多,只是API可能略有不同,下面是定点数完整的代码,具体的用法我就不做详细说明了,我简单的说明一下
用法

// Update is called once per frame
void Update()
{if (Input.GetKeyDown(KeyCode.Space)){FixedNumber fn = new FixedNumber(f);Debug.LogError(fn);Debug.LogError(fn.GetValue());Debug.LogError(fn.ToFloat());}
}

定点数代码

using System;/// <summary>
/// 定点数 使用Int64实现
/// </summary>
[Serializable]
public struct FixedNumber
{/// <summary>/// 小数占用位数/// </summary>public static int Fix_Fracbits = 16;/// <summary>/// 0/// </summary>public static FixedNumber Zero = new FixedNumber(0);internal Int64 m_Bits;public FixedNumber(int x){m_Bits = (x << Fix_Fracbits);}public FixedNumber(float x){m_Bits = (Int64)((x) * (1 << Fix_Fracbits));}public FixedNumber(Int64 x){m_Bits = ((x) * (1 << Fix_Fracbits));}public Int64 GetValue(){return m_Bits;}public FixedNumber SetValue(Int64 i){m_Bits = i;return this;}public static FixedNumber Lerp(FixedNumber a, FixedNumber b, float t){return a + (b - a) * t;}public static FixedNumber Lerp(FixedNumber a, FixedNumber b, FixedNumber t){return a + (b - a) * t;}public FixedNumber Abs(){return FixedNumber.Abs(this);}public FixedNumber Sqrt(){return FixedNumber.Sqrt(this);}//******************* +  **************************public static FixedNumber operator +(FixedNumber p1, FixedNumber p2){FixedNumber tmp;tmp.m_Bits = p1.m_Bits + p2.m_Bits;return tmp;}public static FixedNumber operator +(FixedNumber p1, int p2){FixedNumber tmp;tmp.m_Bits = p1.m_Bits + (Int64)(p2 << Fix_Fracbits);return tmp;}public static FixedNumber operator +(int p1, FixedNumber p2){return p2 + p1;}public static FixedNumber operator +(FixedNumber p1, Int64 p2){FixedNumber tmp;tmp.m_Bits = p1.m_Bits + p2 << Fix_Fracbits;return tmp;}public static FixedNumber operator +(Int64 p1, FixedNumber p2){return p2 + p1;}public static FixedNumber operator +(FixedNumber p1, float p2){FixedNumber tmp;tmp.m_Bits = p1.m_Bits + (Int64)(p2 * (1 << Fix_Fracbits));return tmp;}public static FixedNumber operator +(float p1, FixedNumber p2){FixedNumber tmp = p2 + p1;return tmp;}//*******************  -  **************************public static FixedNumber operator -(FixedNumber p1, FixedNumber p2){FixedNumber tmp;tmp.m_Bits = p1.m_Bits - p2.m_Bits;return tmp;}public static FixedNumber operator -(FixedNumber p1, int p2){FixedNumber tmp;tmp.m_Bits = p1.m_Bits - (Int64)(p2 << Fix_Fracbits);return tmp;}public static FixedNumber operator -(int p1, FixedNumber p2){FixedNumber tmp;tmp.m_Bits = (p1 << Fix_Fracbits) - p2.m_Bits;return tmp;}public static FixedNumber operator -(FixedNumber p1, Int64 p2){FixedNumber tmp;tmp.m_Bits = p1.m_Bits - (p2 << Fix_Fracbits);return tmp;}public static FixedNumber operator -(Int64 p1, FixedNumber p2){FixedNumber tmp;tmp.m_Bits = (p1 << Fix_Fracbits) - p2.m_Bits;return tmp;}public static FixedNumber operator -(float p1, FixedNumber p2){FixedNumber tmp;tmp.m_Bits = (Int64)(p1 * (1 << Fix_Fracbits)) - p2.m_Bits;return tmp;}public static FixedNumber operator -(FixedNumber p1, float p2){FixedNumber tmp;tmp.m_Bits = p1.m_Bits - (Int64)(p2 * (1 << Fix_Fracbits));return tmp;}//******************* * **************************public static FixedNumber operator *(FixedNumber p1, FixedNumber p2){FixedNumber tmp;tmp.m_Bits = ((p1.m_Bits) * (p2.m_Bits)) >> (Fix_Fracbits);return tmp;}public static FixedNumber operator *(int p1, FixedNumber p2){FixedNumber tmp;tmp.m_Bits = p1 * p2.m_Bits;return tmp;}public static FixedNumber operator *(FixedNumber p1, int p2){return p2 * p1;}public static FixedNumber operator *(FixedNumber p1, float p2){FixedNumber tmp;tmp.m_Bits = (Int64)(p1.m_Bits * p2);return tmp;}public static FixedNumber operator *(float p1, FixedNumber p2){FixedNumber tmp;tmp.m_Bits = (Int64)(p1 * p2.m_Bits);return tmp;}//******************* / **************************public static FixedNumber operator /(FixedNumber p1, FixedNumber p2){FixedNumber tmp;if (p2 == FixedNumber.Zero){//UnityEngine.Debug.LogError("/0");tmp.m_Bits = Zero.m_Bits;}else{tmp.m_Bits = (p1.m_Bits) * (1 << Fix_Fracbits) / (p2.m_Bits);}return tmp;}public static FixedNumber operator /(FixedNumber p1, int p2){FixedNumber tmp;if (p2 == 0){//UnityEngine.Debug.LogError("/0");tmp.m_Bits = Zero.m_Bits;}else{tmp.m_Bits = p1.m_Bits / (p2);}return tmp;}public static FixedNumber operator %(FixedNumber p1, int p2){FixedNumber tmp;if (p2 == 0){//UnityEngine.Debug.LogError("/0");tmp.m_Bits = Zero.m_Bits;}else{tmp.m_Bits = (p1.m_Bits % (p2 << Fix_Fracbits));}return tmp;}public static FixedNumber operator /(int p1, FixedNumber p2){FixedNumber tmp;if (p2 == Zero){//UnityEngine.Debug.LogError("/0");tmp.m_Bits = Zero.m_Bits;}else{Int64 tmp2 = ((Int64)p1 << Fix_Fracbits << Fix_Fracbits);tmp.m_Bits = tmp2 / (p2.m_Bits);}return tmp;}public static FixedNumber operator /(FixedNumber p1, Int64 p2){FixedNumber tmp;if (p2 == 0){//UnityEngine.Debug.LogError("/0");tmp.m_Bits = Zero.m_Bits;}else{tmp.m_Bits = p1.m_Bits / (p2);}return tmp;}public static FixedNumber operator /(Int64 p1, FixedNumber p2){FixedNumber tmp;if (p2 == Zero){//UnityEngine.Debug.LogError("/0");tmp.m_Bits = Zero.m_Bits;}else{if (p1 > Int32.MaxValue || p1 < Int32.MinValue){tmp.m_Bits = 0;return tmp;}tmp.m_Bits = (p1 << Fix_Fracbits) / (p2.m_Bits);}return tmp;}public static FixedNumber operator /(float p1, FixedNumber p2){FixedNumber tmp;if (p2 == Zero){//UnityEngine.Debug.LogError("/0");tmp.m_Bits = Zero.m_Bits;}else{Int64 tmp1 = (Int64)p1 * ((Int64)1 << Fix_Fracbits << Fix_Fracbits);tmp.m_Bits = (tmp1) / (p2.m_Bits);}return tmp;}public static FixedNumber operator /(FixedNumber p1, float p2){FixedNumber tmp;if (p2 > -0.000001f && p2 < 0.000001f){//UnityEngine.Debug.LogError("/0");tmp.m_Bits = Zero.m_Bits;}else{tmp.m_Bits = (p1.m_Bits << Fix_Fracbits) / ((Int64)(p2 * (1 << Fix_Fracbits)));}return tmp;}public static FixedNumber Sqrt(FixedNumber p1){FixedNumber tmp;Int64 ltmp = p1.m_Bits * (1 << Fix_Fracbits);tmp.m_Bits = (Int64)Math.Sqrt(ltmp);return tmp;}public static bool operator >(FixedNumber p1, FixedNumber p2){return (p1.m_Bits > p2.m_Bits) ? true : false;}public static bool operator <(FixedNumber p1, FixedNumber p2){return (p1.m_Bits < p2.m_Bits) ? true : false;}public static bool operator <=(FixedNumber p1, FixedNumber p2){return (p1.m_Bits <= p2.m_Bits) ? true : false;}public static bool operator >=(FixedNumber p1, FixedNumber p2){return (p1.m_Bits >= p2.m_Bits) ? true : false;}public static bool operator !=(FixedNumber p1, FixedNumber p2){return (p1.m_Bits != p2.m_Bits) ? true : false;}public static bool operator ==(FixedNumber p1, FixedNumber p2){return (p1.m_Bits == p2.m_Bits) ? true : false;}public static bool Equals(FixedNumber p1, FixedNumber p2){return (p1.m_Bits == p2.m_Bits) ? true : false;}public bool Equals(FixedNumber right){if (m_Bits == right.m_Bits){return true;}return false;}public static bool operator >(FixedNumber p1, float p2){return (p1.m_Bits > (p2 * (1 << Fix_Fracbits))) ? true : false;}public static bool operator <(FixedNumber p1, float p2){return (p1.m_Bits < (p2 * (1 << Fix_Fracbits))) ? true : false;}public static bool operator <=(FixedNumber p1, float p2){return (p1.m_Bits <= p2 * (1 << Fix_Fracbits)) ? true : false;}public static bool operator >=(FixedNumber p1, float p2){return (p1.m_Bits >= p2 * (1 << Fix_Fracbits)) ? true : false;}public static bool operator !=(FixedNumber p1, float p2){return (p1.m_Bits != p2 * (1 << Fix_Fracbits)) ? true : false;}public static bool operator ==(FixedNumber p1, float p2){return (p1.m_Bits == p2 * (1 << Fix_Fracbits)) ? true : false;}public static FixedNumber Max(){FixedNumber tmp;tmp.m_Bits = Int64.MaxValue;return tmp;}public static FixedNumber Max(FixedNumber p1, FixedNumber p2){return p1.m_Bits > p2.m_Bits ? p1 : p2;}public static FixedNumber Min(FixedNumber p1, FixedNumber p2){return p1.m_Bits < p2.m_Bits ? p1 : p2;}public static FixedNumber Precision(){FixedNumber tmp;tmp.m_Bits = 1;return tmp;}public static FixedNumber MaxValue(){FixedNumber tmp;tmp.m_Bits = Int64.MaxValue;return tmp;}public static FixedNumber Abs(FixedNumber P1){FixedNumber tmp;tmp.m_Bits = Math.Abs(P1.m_Bits);return tmp;}public static FixedNumber operator -(FixedNumber p1){FixedNumber tmp;tmp.m_Bits = -p1.m_Bits;return tmp;}public float ToFloat(){return m_Bits / (float)(1 << Fix_Fracbits);}public UnityEngine.Quaternion ToUnityRotation(){return UnityEngine.Quaternion.Euler(0, -this.ToFloat(), 0);}public int ToInt(){return (int)(m_Bits >> (Fix_Fracbits));}public override string ToString(){double tmp = (double)m_Bits / (double)(1 << Fix_Fracbits);return tmp.ToString();}
}

定点数二维向量

using UnityEngine;/// <summary>
/// 定点数二维向量
/// </summary>
[System.Serializable]
public struct Fixed2
{public FixedNumber x;public FixedNumber y;public Fixed2(float x, float y){this.x = new FixedNumber(x);this.y = new FixedNumber(y);}public Fixed2(FixedNumber x, FixedNumber y){this.x = x;this.y = y;}public Vector3 ToVector3(){return new Vector3(x.ToFloat(), 0, y.ToFloat());}public static Fixed2 GetV2(FixedNumber x, FixedNumber y){return new Fixed2(x, y);}public static Fixed2 operator +(Fixed2 a, Fixed2 b){return new Fixed2(a.x + b.x, a.y + b.y);}public static Fixed2 operator -(Fixed2 a, Fixed2 b){return new Fixed2(a.x - b.x, a.y - b.y);}public static Fixed2 operator *(Fixed2 a, FixedNumber b){return new Fixed2(a.x * b, a.y * b);}public Fixed2 Rotate(FixedNumber value){FixedNumber tx, ty;tx = MathFixed.CosAngle(value) * x - y * MathFixed.SinAngle(value);ty = MathFixed.CosAngle(value) * y + x * MathFixed.SinAngle(value);//1,0   tx=1*0-0  tyreturn new Fixed2(tx, ty);}public FixedNumber ToRotation(){if (x == 0 && y == 0){return new FixedNumber();}FixedNumber sin = this.normalized.y;if (this.x >= 0){return MathFixed.Asin(sin) / MathFixed.PI * 180;}else{return MathFixed.Asin(-sin) / MathFixed.PI * 180 + 180;}}public static Fixed2 Parse(FixedNumber ratio){return new Fixed2(MathFixed.CosAngle(ratio), MathFixed.SinAngle(ratio));}public Fixed2 normalized{get{if (x == 0 && y == 0){return new Fixed2();}FixedNumber n = ((x * x) + (y * y)).Sqrt();return new Fixed2(x / n, y / n);}}public static Fixed2 left = new Fixed2(-1, 0);public static Fixed2 right = new Fixed2(1, 0);public static Fixed2 up = new Fixed2(0, 1);public static Fixed2 down = new Fixed2(0, -1);public static Fixed2 zero = new Fixed2(0, 0);public FixedNumber Dot(Fixed2 b){return Dot(this, b);}public static FixedNumber Dot(Fixed2 a, Fixed2 b){return a.x * b.x + b.y * a.y;}public static Fixed2 operator -(Fixed2 a){return new Fixed2(-a.x, -a.y);}public static Fixed3 operator *(Fixed2 a, Fixed2 b){return new Fixed3(new FixedNumber(), new FixedNumber(), a.x * b.y - a.y * b.x);}public static bool operator ==(Fixed2 a, Fixed2 b){return a.x == b.x && a.y == b.y;}public static bool operator !=(Fixed2 a, Fixed2 b){return a.x != b.x || a.y != b.y;}public override string ToString(){return "{" + x.ToString() + "," + y.ToString() + "}";}}

定点数三维向量

using UnityEngine;/// <summary>
/// 定点数三维向量
/// </summary>
public struct Fixed3
{public FixedNumber x{get;private set;}public FixedNumber y{get;private set;}public FixedNumber z{get;private set;}public Fixed3(int x = 0, int y = 0, int z = 0){this.x = new FixedNumber(x);this.y = new FixedNumber(y);this.z = new FixedNumber(z);}public Fixed3(float x, float y, float z){this.x = new FixedNumber(x);this.y = new FixedNumber(y);this.z = new FixedNumber(z);}public Fixed3(FixedNumber x, FixedNumber y, FixedNumber z){this.x = x;this.y = y;this.z = z;}public Vector3 ToVector3(){return new Vector3(x.ToFloat(), 0, y.ToFloat());}public static Fixed3 operator +(Fixed3 a, Fixed3 b){return new Fixed3(a.x + b.x, a.y + b.y, a.z + b.z);}public static Fixed3 operator -(Fixed3 a, Fixed3 b){return new Fixed3(a.x - b.x, a.y - b.y, a.z - b.z);}public static Fixed3 left = new Fixed3(-1, 0);public static Fixed3 right = new Fixed3(1, 0);public static Fixed3 up = new Fixed3(0, 1);public static Fixed3 down = new Fixed3(0, -1);public static Fixed3 zero = new Fixed3(0, 0);public FixedNumber Dot(Fixed3 b){return Dot(this, b);}public static FixedNumber Dot(Fixed3 a, Fixed3 b){return a.x * b.x + b.y * a.y;}public static Fixed3 operator -(Fixed3 a){return new Fixed3(-a.x, -a.y, -a.z);}public static Fixed2 operator *(Fixed3 a, Fixed2 b){return new Fixed2(-a.z * b.y, a.z * b.x);}public override string ToString(){return "{" + x.ToString() + "," + y.ToString() + "}";}
}

定点数数学类

using System.Collections.Generic;/// <summary>
/// 定点数数学类
/// </summary>
class MathFixed
{protected static int tabCount = 18 * 4;/// <summary>/// sin值对应表/// </summary>protected static readonly List<FixedNumber> _m_SinTab = new List<FixedNumber>();public static readonly FixedNumber PI = new FixedNumber(3.14159265f);protected static FixedNumber GetSinTab(FixedNumber r){FixedNumber i = new FixedNumber(r.ToInt());//UnityEngine.Debug.Log(i.ToInt());if (i.ToInt() == _m_SinTab.Count - 1){return _m_SinTab[(int)i.ToInt()];}else{// UnityEngine.Debug.Log(i.ToInt()+":"+ _m_SinTab[i.ToInt()]+":"+ Ratio.Lerp(_m_SinTab[i.ToInt()], _m_SinTab[(i + 1).ToInt()], r - i));return FixedNumber.Lerp(_m_SinTab[(int)i.ToInt()], _m_SinTab[(int)(i + 1).ToInt()], r - i);}}public static FixedNumber GetAsinTab(FixedNumber sin){MathFixed math = Instance;//UnityEngine.Debug.Log("GetAsinTab");for (int i = _m_SinTab.Count - 1; i >= 0; i--){if (sin > _m_SinTab[i]){if (i == _m_SinTab.Count - 1){return new FixedNumber(i) / (tabCount / 4) * (PI / 2);}else{//return new Ratio(i);return FixedNumber.Lerp(new FixedNumber(i), new FixedNumber(i + 1), (sin - _m_SinTab[i]) / (_m_SinTab[i + 1] - _m_SinTab[i])) / (tabCount / 4) * (PI / 2);}}}return new FixedNumber();}protected static MathFixed Instance{get{if (_m_instance == null){_m_instance = new MathFixed();}return _m_instance;}}protected static MathFixed _m_instance;protected MathFixed(){if (_m_instance == null){_m_SinTab.Add(new FixedNumber(0f));//0_m_SinTab.Add(new FixedNumber(0.08715f));_m_SinTab.Add(new FixedNumber(0.17364f));_m_SinTab.Add(new FixedNumber(0.25881f));_m_SinTab.Add(new FixedNumber(0.34202f));//20_m_SinTab.Add(new FixedNumber(0.42261f));_m_SinTab.Add(new FixedNumber(0.5f));_m_SinTab.Add(new FixedNumber(0.57357f));//35_m_SinTab.Add(new FixedNumber(0.64278f));_m_SinTab.Add(new FixedNumber(0.70710f));_m_SinTab.Add(new FixedNumber(0.76604f));_m_SinTab.Add(new FixedNumber(0.81915f));//55_m_SinTab.Add(new FixedNumber(0.86602f));//60_m_SinTab.Add(new FixedNumber(0.90630f));_m_SinTab.Add(new FixedNumber(0.93969f));_m_SinTab.Add(new FixedNumber(0.96592f));_m_SinTab.Add(new FixedNumber(0.98480f));//80_m_SinTab.Add(new FixedNumber(0.99619f));_m_SinTab.Add(new FixedNumber(1f));}}public static FixedNumber PiToAngel(FixedNumber pi){return pi / PI * 180;}public static FixedNumber Asin(FixedNumber sin){if (sin < -1 || sin > 1) { return new FixedNumber(); }if (sin >= 0){return GetAsinTab(sin);}else{return -GetAsinTab(-sin);}}public static FixedNumber Sin(FixedNumber r){MathFixed math = Instance;//int tabCount = SinTab.Count*4;FixedNumber result = new FixedNumber();r = (r * tabCount / 2 / PI);//int n = r.ToInt();while (r < 0){r += tabCount;}while (r > tabCount){r -= tabCount;}if (r >= 0 && r <= tabCount / 4)                // 0 ~ PI/2{result = GetSinTab(r);}else if (r > tabCount / 4 && r < tabCount / 2)       // PI/2 ~ PI{r -= new FixedNumber(tabCount / 4);result = GetSinTab(new FixedNumber(tabCount / 4) - r);}else if (r >= tabCount / 2 && r < 3 * tabCount / 4)    // PI ~ 3/4*PI{r -= new FixedNumber(tabCount / 2);result = -GetSinTab(r);}else if (r >= 3 * tabCount / 4 && r < tabCount)      // 3/4*PI ~ 2*PI{r = new FixedNumber(tabCount) - r;result = -GetSinTab(r);}return result;}public static FixedNumber Abs(FixedNumber ratio){return FixedNumber.Abs(ratio);}public static FixedNumber Sqrt(FixedNumber r){return FixedNumber.Sqrt(r);}public static FixedNumber Cos(FixedNumber r){return Sin(r + PI / 2);}public static FixedNumber SinAngle(FixedNumber angle){return Sin(angle / 180 * PI);}public static FixedNumber CosAngle(FixedNumber angle){return Cos(angle / 180 * PI);}
}

总结

上面做的封装基本还算完善,可以看下代码具体怎么使用。
感谢大家的支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenMV学习笔记

一、感光元件----sensor sensor.reset() ----初始化感光元件 sensor.reset() 的功能包括&#xff1a; 初始化感光元件&#xff1a; 将摄像头感光元件初始化为默认状态&#xff0c;以确保其处于可用的工作状态。 恢复默认设置&#xff1a; 将摄像头的其他配置参数还原为默认…

嵌入式中全面解析 SPI 通信协议方法

SPI 的英文全称为 Serial Peripheral Interface&#xff0c;顾名思义为串行外设接口。SPI 是一种同步串行通信接口规范&#xff0c;主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发&#xff0c;后发展成了行业规范。 SPI 是一种高速的、全双工的…

算法沉淀——优先级队列(堆)(leetcode真题剖析)

算法沉淀——优先级队列 01.最后一块石头的重量02.数据流中的第 K 大元素03.前K个高频单词04.数据流的中位数 优先队列&#xff08;Priority Queue&#xff09;是一种抽象数据类型&#xff0c;它类似于队列&#xff08;Queue&#xff09;&#xff0c;但是每个元素都有一个关联的…

嵌入式Linux平台大文件生成以及处理方法

在日常工作中&#xff0c;为了验证某些场景下的功能&#xff0c;经常需要人为构造一些大文件进行测试&#xff0c;有时需要用大文件来测试下载速度&#xff0c;有时需要用大文件来覆盖磁盘空间&#xff1b;偶尔会看到一些网络博文会教大家如何构造大文件&#xff1b;但是当需要…

英伟达(NVIDIA)和CUDA

英伟达&#xff08;NVIDIA&#xff09;是一家知名的图形处理器&#xff08;GPU&#xff09;制造公司&#xff0c;而CUDA则是NVIDIA推出的一种并行计算架构和编程模型。CUDA全称为Compute Unified Device Architecture&#xff0c;即计算统一设备架构&#xff0c;它允许开发者使…

43. C++ 指针合集

C/C指针合集 1. 指针变量的空间大小 指针变量的空间大小是固定值&#xff08;64位下为8字节&#xff0c; 32位下为4字节&#xff09;&#xff0c;跟其指向的数据类型及多级指针无关&#xff0c;与编译平台相关&#xff08;指针大小由当前CPU运行模式的寻址位数决定&#xff0…

杨中科 ASP.NET DI综合案例

综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务&#xff0c;然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置&#xff0c;可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…

第三百四十九回

文章目录 1. 概念介绍2. 原理与方法2.1 知识对比2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"加密包crypto"相关的内容&#xff0c;本章回中将介绍characters包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 在项目中会遇到获取字…

String类常用方法(Java)

String类 字符串相减/替换 使用 String 类的 replace() 方法来实现这个功能: replace(“target”,“replacement”) 如果你想将引号添加到字符串中&#xff0c;你可以使用转义字符 \" 来表示双引号。 String str1 "abcdefg"; String str2 "bcd"…

Django实战:部署项目 【资产管理系统】,Django完整项目学习研究(项目全解析,部署教程,非常详细)

导言 关于Django&#xff0c;我已经和大家分享了一些知识&#xff0c;考虑到一些伙伴需要在实际的项目中去理解。所以我上传了一套Django的项目学习源码&#xff0c;已经和本文章进行了绑定。大家可以自行下载学习&#xff0c;考虑到一些伙伴是初学者&#xff0c;几年前&#…

OpenAI又出王炸,Sora是否要开启视频AI新时代?

OpenAI又出王炸&#xff0c;Sora是否要开启视频AI新时代&#xff1f; 关注微信公众号 DeepGoAI 前几天我们还在讨论 如何让ChatGPT3.5变得更聪明 今天OpenAI就带着新王炸出现了 如同ChatGPT一般 在计算机领域掀起轩然大波 开启真正视频AI新时代 那就是 Sora 很多同学可…

结构体对齐规则及为什么会有结构体对齐

前言&#xff1a; 大家在学习结构体中&#xff0c;在计算结构体大小时想必会很疑惑&#xff0c;为什么结构体的大小不是按照常理像数组一样一个字节一个字节的挨在一起放&#xff1f;今天带大家一起深入探讨一下背后的规则和原因。 结构体对齐规则&#xff1a; 结构体对齐其实…

离散数学截图2

为什么G中阶大于2的元素&#xff0c;一定有偶数个 在有限群G中&#xff0c;阶大于2的元素个数一定是偶数的原因如下&#xff1a; 设 aaa 是群G中一个阶大于2的元素&#xff0c;那么根据群的定义和阶的概念&#xff08;即某个元素的幂次使得其等于单位元的最小正整数&#xff…

【Linux】 Linux 小项目—— 进度条

进度条 基础知识1 \r && \n2 行缓冲区3 函数介绍 进度条实现版本 1代码实现运行效果 版本2 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 基础知识 1 \r &&a…

linux 安装docker

目录 环境 操作步骤 1 下载脚本 2 执行脚本 3 检查docker版本&#xff0c;证明安装成功 环境 阿里云 ubuntu 22.04 64位 操作步骤 参考linux系统安装docker-腾讯云开发者社区-腾讯云 (tencent.com) 1 下载脚本 curl -fsSL https://get.docker.com -o get-docker.sh …

牛客小白月赛87

说明 年后第一次写题&#xff0c;已经麻了&#xff0c;这次的题很简单但居然只写了两道题。有种本该发挥80分的水平&#xff0c;但是只做出了20分的水平的感觉。不过剩下几个题&#xff08;除了G题&#xff09;&#xff0c;比完赛一小时内就AC了。欢迎大家交流学习。&#xff0…

SpringBoot 整合 Redis 全面教程:从配置到使用

Redis 是一种高性能的键值存储数据库&#xff0c;而 Spring Boot 是一个简化了开发过程的 Java 框架。将两者结合&#xff0c;可以轻松地在 Spring Boot 项目中使用 Redis 来实现数据缓存、会话管理和分布式锁等功能。 一、添加 Redis 依赖 在 pom.xml 文件中添加 Redis 相关…

OpenCV 笔记(22):图像的缩放——最近邻插值、双线性插值算法

1. 图像缩放 1.1 简介 图像缩放是指通过增加或减少像素来改变图像尺寸的过程&#xff0c;是图像处理中常见的操作。图像缩放会涉及效率和图像质量之间的权衡。 图像放大&#xff08;也称为上采样或插值&#xff09;的主要目的是放大原图像&#xff0c;以便在更高分辨率的显示设…

学习 JavaScript 闭包

1. 前言 闭包是 JavaScript 中一种非常重要的概念&#xff0c;它允许函数访问其外部作用域中的变量&#xff0c;即使在函数被返回或者在其原始定义的作用域之外执行时仍然可以访问这些变量。 在讲解闭包之前我们得弄清楚下面的概念&#xff1a; 作用域链&#xff1a; JavaSc…

RK3568笔记十五:触摸屏测试

若该文为原创文章&#xff0c;转载请注明原文出处。 使用正点原子的ATK-RK3568板子&#xff0c;一直在测试屏幕和视频&#xff0c;突然想到触摸屏测试&#xff0c;一直没有用过&#xff0c;原子给的demo跑的是QT系统&#xff0c;触摸功能是正常的&#xff0c;测试一下&#xf…