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

C++面向对象(OOP)编程-位运算详解

本文主要介绍原码、位运算的种类,以及常用的位运算的使用场景。

目录

1 原码、反码、补码

2 有符号和无符号数

3 位运算

4 位运算符使用规则

4.1 逻辑移位和算术移位

4.1.1 逻辑左移和算法左移

4.1.2 逻辑右移和算术右移

4.1.3 总结

4.2 位运算的应用场景

5 位运算的详细使用

5.1 字节序介绍

5.2 应用

5.2.1整数的第N位 置1或者0

5.2.2 整数的一段位置1或者0

5.2.3 奇偶性判断

5.2.4 特定位翻位

5.2.5 交换数据(不使用第三方变量)

5.2.6 符号的变换(将一个整数变为负数)

5.2.7 求绝对值

5.2.8 一些操作实例

5.2.9 给定整数N,判断是否是2的整数次幂。

5.2.10 交换一个32位无符号数的前后16bit位

5.2.11 两数平均(防溢出)

5.2.12 求一个数的二进制中1的个数

5.2.13 打印出二进制数

5.2.14 无符号bit位翻转

5.2.15 整数的除法运算        


1 原码、反码、补码

        计算机中数的存储都是以二进制的形式存储的,数据的表示形式有原码、反码和补码。现在绝大多数计算机都使用补码表示法,补码表示将计算机中的减法运算转换成加法运算,统一了计算机。        

        原码,最高位表示符号位,0表示正数,1表示负数,其余位表示数值大小。例如,8位的+5的原码是00000101,-5的原码是10000101。

        反码(ones' complement):正数的反码和原码相同,负数的反码是将原码中除符号位外的所有位按位取反。例如,+5的反码是00000101,-5的反码是11111010。

        补码(two's complement):正数的补码和原码相同,负数的补码是将原码中除符号位外的所有位按位取反后加1。例如,+5的补码是00000101,-5的补码是11111011。

2 有符号和无符号数


        a. 有符号数 signed ,首位为符号位,0正 1负 ,使用源码和反码表示,无法表示出(对于

        8bit)-128,使用补码表示:10000000 表示-128,一般的机器都是补码表示法,范围为

         - (2^(n-1)) ~ 2^(n-1) - 1

        b. 无符号数 unsigned,表示的正数的范围会变大 ,范围 为0 ~ 2^n -1

        c. 计算机中的补码将计算机中的减法运算统一为加法运算

        d. 0是无符号数

        具体搞懂有符号和无符号的加减和表示:(加减溢出后的结果)

8bit有符号和无符号数的对比:有符号范围-128~127 无符号范围:0~255

首先明确几乎所有的计算机都是补码表示法:

有符号数:(-128~127)

         -128 的二进制补码 10000000

         -127 的二进制补码 10000001

         +127的二进制补码 01111111

         +1    的二进制补码 00000001

         -1     的二进制补码 11111111

补码将减法转换成加法,舍去溢出位

例子:

int8_t lp = -128-1; // 10000000 + 11111111 = 101111111 舍掉溢出为 01111111 故为127

printf("%d\n",lp); // 127

int8_t lp1 = 127+1; // 01111111 + 00000001 = 100000000 为 -128

printf("%d\n",lp1); // -128

有符号-128的诞生:用10000000来表示-128

int8_t kp = -127 -1; // 10000001 + 11111111 = 110000000 舍掉溢出为 10000000 故为-128

printf("%d\n",kp);    // -128

无符号数:(0~255)非负数,没有符号

        -1     的二进制补码 11111111(有符号)

        +1    的二进制补码 00000001

        +255的二进制补码 11111111

        +128的二进制补码 10000000

        +127的二进制补码 01111111

补码将减法转换成加法,舍去溢出位

例子:

uint8_t kp = 0-1; // 00000000 + 11111111 = 11111111 故为255

printf("%d\n",kp); // 255

uint8_t kp1 = 255+1; // 11111111 + 00000001 = 100000000 舍掉溢出为 00000000 故为0

printf("%d\n",kp1); // 0

3 位运算

       位运算是一种按二进制位进行运算的方式,常用于清零、取指定位、判断奇偶、翻转等场景。常见的位运算有:与(&)、或(|)、非(~)、异或(^)和移位运算符(>)。 C语言基本的位操作符有与、或、异或、取反、左移、右移六种位运算符。如下表所示:

符号描述运算规则
&两个位都为1时,结果才为1(同1为,不同为0)
|两个位都为0时,结果才为0(同0为0,不同为1)
^异或两个位相同为0,相异为1(相同为0,不同为1)
~取反0变1,1变0
<<左移各二进位全部左移若干位,高位丢弃,低位补0
>>又移各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

        详细解释:

  1. 与(&)运算:将两个二进制数的对应位进行与运算,结果为1则对应位相同,否则不同。例如,3和5的二进制表示分别为0011和0101,它们的与运算结果为0001,即1。

  2. 或(|)运算:将两个二进制数的对应位进行或运算,结果为1则至少有一个对应位为1,否则为0。例如,3和5的二进制表示分别为0011和0101,它们的或运算结果为0111,即7。

  3. 非(~)运算:对一个二进制数取反,即将所有位翻转。例如,3的二进制表示为0011,它的非运算结果为1100,即-4。

  4. 异或(^)运算:将两个二进制数的对应位进行异或运算,结果为1则对应位不同,否则相同。例如,3和5的二进制表示分别为0011和0101,它们的异或运算结果为0110,即6。

  5. 移位运算符(>):将一个二进制数的所有位向右移动指定位数,左边空出的位用0填充,右边多出来的位被丢弃。例如,将数字3的二进制表示向右移动两位得到0000,即0。

4 位运算符使用规则

        (1)六种位运算只能用于整型数据,对float和double类型进行位操作会被编译器报错。

        (2)逻辑运算与位运算的区别:逻辑运算是将参与运算的两个表达式整体的结果进行逻辑运算,而位运算是将参与运算的两个数据,按对应的二进制数逐位进行逻辑运算。逻辑运算符有逻辑与&&、逻辑或||、逻辑非!,位运算则有六种运算符,位与&、位或|、位异或^、位取反~、位左移<<、位右移>>。

        (3)如果左移位数>=类型长度,在GCC环境下,GCC编译器会报警告,但实际左移位数为左移位数%(8 * sizeof(int))。例如:

int i = 1, j = 0x80000000; //设int为32位
i = i << 33;   // 33 % 32 = 1 左移1位,i变成2
j = j << 33;   // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃


        (4)在C语言中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变。

                左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。 算术移位是相对于逻辑移位,它们在左移操作中都一样,低位补0即可,但在右移中逻辑移位的高位补0而算术移位的高位是补符号位。

        右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变。符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移。当移动的位数超过类型的长度时,会取余数,然后移动余数个位。

int i = 0x80000000;
i = i >> 1;  //i的值不会变成0x40000000,而会变成0xc0000000

        上述代码移位后的结果是0xc0000000,因为有符号数的算术右移,需要保持符号位不变,所以补符号位
        (5)位操作符的运算优先级比较低,因为尽量使用括号来确保运算顺序,否则很可能会得到莫明其妙 的结果。比如要得到像1,3,5,9这些2^i+1的数字。写成int a = 1 << i + 1;是不对的,程序会先执行i + 1,再执行左移操作。应该写成int a = (1 << i) + 1。

4.1 逻辑移位和算术移位

4.1.1 逻辑左移和算法左移

        逻辑左移和算术左移的区别主要在于它们处理二进制数的高位的方式。对于逻辑左移,右边会补0;而对于算术左移,右边不仅补0,还会根据原始数值的符号位进行填充。例如,对于二进制数10101011,逻辑左移一位后得到01010110,而算术左移一位后则得到11010110。

4.1.2 逻辑右移和算术右移

        逻辑右移和算术右移之间也存在显著差异。在逻辑右移中,左边会补0,而在算术右移中,左边会填入符号位。这意味着,如果原始数值是有符号数,算术右移会保持原始数的符号位不变,而逻辑右移则不会。

4.1.3 总结

        逻辑移位和算术移位的主要区别在于它们如何对待被移出的位。逻辑移位主要用于无符号数的操作,而算术移位则用于有符号数的操作,以保持数值的准确性。逻辑移位仅仅是移位不会考虑符号位,而算术移位会保留符号位的准确。

对于一个有符号数-3和3 的一些移位操作:

{// 负数的补码表示法:    除符号位其他位反码+1// -3的二进制原码: 10000000000000000000000000000011// -3的二进制反码: 11111111111111111111111111111100// -3的二进制补码: 11111111111111111111111111111101int a = -3; // 二进制表示为 11111111111111111111111111111011int b = 3;cout << "   描述  " << "              二进制              " <<    "     十进制     " << " 十六进制 " << endl;cout << "+3的补码 : " << bitset<32>(b) << "       " << hex << b << "               " << dec << b << endl;cout << "-3的补码 : " << bitset<32>(a) << "       " << hex << a << "       " << dec << a <<  endl;a = a << 2; // 左移2位,结果为 -6,二进制表示为 11111111111111111111111111110000cout << "-3左移2位: " << bitset<32>(a) << "       " << hex << a <<  "       " << dec << a <<  endl;b = b << 2;cout << "+3左移2位: " << bitset<32>(b) << "       " << hex << b <<  "              " << dec << b <<  endl;a = -3;a = a >> 2; // 右移2位,结果为 -3,二进制表示为 11111111111111111111111111100000cout << "-3右移2位: " << bitset<32>(a) << "       " << hex << a <<  "       " << dec << a <<  endl;b = 3;b = b >> 2;cout << "+3右移2位: " << bitset<32>(b) << "       " << hex << b <<  "               " << dec << b <<  endl;}

        运行结果:

   描述                二进制                   十六进制      十进制 
+3的补码 : 00000000000000000000000000000011      3              3
-3的补码 : 11111111111111111111111111111101      fffffffd      -3
-3左移2位: 11111111111111111111111111110100      fffffff4      -12
+3左移2位: 00000000000000000000000000001100      c             12
-3右移2位: 11111111111111111111111111111111      ffffffff      -1
+3右移2位: 00000000000000000000000000000000      0              0

        分析结果可以很清晰的理解有符号数的算术移位的补全符号位的操作。

4.2 位运算的应用场景

        以下是一些常见的应用场景:

  1. 位掩码:使用位与运算符(&)和位或运算符(|),可以快速地将某些位置0或保留。
  2. 求反:使用按位非运算符(~),可以将二进制数反转,例如对一个数取反偶数次结果是它本身,常用场景包括求相反数。
  3. 判断奇偶性:通过对int型变量与1进行与运算,如果结果为0则为偶数,如果结果为1则为奇数。
  4. 提取特定位:通过右移和与运算,可以提取int型变量的特定位,例如a>>k&1可以获取a的第k位的值。
  5. 设置特定位:通过左移和或运算,可以将int型变量的特定位设置为1,例如a|(1<
  6. 大量数据的高效处理:位运算可以直接对内存中的二进制位进行操作,因此在处理大量数据时,位运算可以提高程序的运行效率。
  7. 驱动开发中的置0和置1:在驱动开发中,经常需要指定的位数发生变化,又不能改变其它位的值,这时候位运算的技巧就显得非常重要了。

5 位运算的详细使用

5.1 字节序介绍

        C语言的字节序一般从左到右是:高字节->低字节。

        高位字节--->低位字节 0x11223344,从左到右,由高位字节到低位字节 因此bit的顺序是从右到左递增的 (... bit9 bit8 bit7 bit7 bit5 bit4 bit3 bit2 bit1 bit0)。

        因此bit的序列从右到左是递增的。

5.2 应用

        主要使用& 和 |,bit0为第一位

5.2.1整数的第N位 置1或者0

        1 置某位不变:

                a 只需要 该位与 0 进行或运算(似乎不变就可以了)        

#define SET_BIT_N_NO_CHANGE(X,N)  ((X) | (0U << ((N) - 1)))

        2 置某位为1,其他位不变:

                a 只需要 该位与 1 进行或运算

#define SET_BIT_N(X,N) ((X) | (1U << ((N)-1)))

        3 置某位为0,其他位不变:

                 a 设置相同位数的一个无符号数,置该位为 1 ,然后对该数进行取反,取反后的数与原数进行相与即可。

#define CLEAR_BIT_N(X,N) ((X) & (~(1U << ((N)-1))))

5.2.2 整数的一段位置1或者0

        1 将32位数x的第n位到第m位置1(特定数据段置1)

#define SET_BITS_N_M(x,n,m) ((x) | (((~0U)>>(32-((m)-(n)+1)))<<((n)-1)))

        2 将32位数x的第n位到第m位置0(特定数据段置0)

#define CLEAR_BITS_N_M(x,n,m) ((x) & (~(((~0U)>>(32-((m)-(n)+1)))<<((n)-1))))

        3 取32位数的第n位到第m位(取特定数据段的数)

#define GET_BITS_N_M(x,n,m) (((x) & ~(~(0U)<<((m)-(n)+1))<<((n)-1))>>((n)-1))

        4 保留32位数的第n位到第m位,其他的置0(保留特定数据段,其他位置0)

#define REMAIN_BITS_N_M(x,n,m)  ((x) & (((~0U) >> (32-((m)-(n)+1))) << ((n)-1)))

5.2.3 奇偶性判断

        由二进制数可知,二进制bit0为0为偶数,为1为奇数,因此可以使用 if (( a & 1) == 0) ,则a为偶数,反之为奇数;可以替代if ((a % 2) == 0)。

5.2.4 特定位翻位

       对于一个整数a ,a^1是翻位,a^0是a保持不变

        一般用异或实现,如下对int a = 234; 对a的低8位进行翻位,a = a^0xff;

如下:

{__LOG__("异或运算");int a = 234;//000000000000000000000000 11101010cout << "二进制: " << bitset<32>(a) << hex << " 十六进制: " << a << dec << " 十进制: " << a << endl;a = a ^ 0xff;//000000000000000000000000 00010101cout  << "二进制: " << bitset<32>(a) << hex << " 十六进制: " << a << dec << " 十进制: " << a << endl;}

        运行结果:

*****************异或运算*****************二进制: 00000000000000000000000011101010 十六进制: ea 十进制: 234
二进制: 00000000000000000000000000010101 十六进制: 15 十进制: 21

5.2.5 交换数据(不使用第三方变量)

int a = -12;
int b = 34;a = a^b;
b = a^b;
a = a^b;

 简单分析下为什么可以交换,如下:

int a = -12;
int b = 34;a1 = a^b;
b1 = a1^b;
a2 = a1^b1;最终 b1 和 a2 是输出结果,我们来具体看下:b1 = a1^b = a^b^b = a^0 = aa2 = a1^b1 = a^b^(a1^b) = a^b^(a^b^b)= a^a^b^b^b=b^0 = b至此,交换完毕,这里用到异或运算的交换律和结合律,可以看出让a1和a2用a替代,b1用b替代并不会改变运算结果。

5.2.6 符号的变换(将一个整数变为负数)

        取反+1即是原数的相反数,仅仅针对有符号数对于 int a; a的相反数为(~a) + 1。

int a = 34;int a1 = (~(a)) + 1;//-34

5.2.7 求绝对值

        无符号数的绝对值就是本身,有符号数的绝对值的求法,求int 类型数的绝对值:

// 求有符号数的绝对值
#define GET_ABSOLUTE_VALUE(a)  ((((a)>>31)==0) ? (a) : ((~(a))+1))// a为负数时a >> 31 为 -1// a为正数时a >> 31 为 0

5.2.8 一些操作实例

    unsigned int i = 0x00ff1234;//i |= (0x1<<13);//bit13置1//i |= (0xF<<4);//bit4-bit7置1//i &= ~(1<<17);//清除bit17//i &= ~(0x1f<<12);//清除bit12开始的5位//取出bit3-bit8//i &= (0x3F<<3);//保留bit3-bit8,其他位清零//i >>= 3;//右移3位//给寄存器的bit7-bit17赋值937//i &= ~(0x7FF<<7);//bit7-bit17清零//i |= (937<<7);//bit7-bit17赋值//将寄存器bit7-bit17的值加17// unsigned int a = i;//将a作为i的副本,避免i的其他位被修改// a &= (0x7FF<<7);//取出bit7-bit17//a >>= 7;//// a += 17;//加17// i &= ~(0x7FF<<7);//将i的bit7-bit17清零// i |= (a<<7);//将+17后的数写入bit7-bit17,其他位不变//给一个寄存器的bit7-bit17赋值937,同时给bit21-bit25赋值17i &= ~((0x7FF<<7) | (0x1F<<21));//bit7-bit17、bit21-bit25清零i |= ((937<<7) | (17<<21));//bit7-bit17、bit21-bit25赋值

5.2.9 给定整数N,判断是否是2的整数次幂。

// 要求N 大于0
#define IS_2_N(N) ( (((N) & ((N)-1))==0) ? true : false )

5.2.10 交换一个32位无符号数的前后16bit位

// 交换一个32位无符号数的前后16bit位
#define SWAP_A16_B16(X) (((X) >> 16) | ((X) << 16))

5.2.11 两数平均(防溢出)

inline int average1(int x, int y)
{return (x >> 1) + (y >> 1) + (x & y & 1);
}inline int average2(int x, int y)
{return (x & y) + ((x ^ y) >> 1);
}

5.2.12 求一个数的二进制中1的个数

int popcount(int x)
{int res = 0;for(; x; x&=x-1) res ++;return res;
}

5.2.13 打印出二进制数

void binary_to(int num)
{cout << "二进制: ";for (int i = 31; i >= 0; i--) {if ((num & (1 << i)) != 0) {cout << "1";} else {cout << "0";}}cout << endl;
}

5.2.14 无符号bit位翻转

uint32_t reverse_bit(uint32_t value)
{uint32_t num = 0;int i = 0;for (i = 1; i < 32; i++){num += value & 1;num <<= 1;value >>= 1;}return num;
}

5.2.15 整数的除法运算        

        舍掉小数部分:(有符号和无符号都是一样的操作)


// 除以256int a = 2345;a = a >> 8uint32_t b = 2345;b = b >> 8;

        四舍五入法:

        无符号数

// 除以256
uint32_t a = 2345;a = (a + 128) >> 8;

        有符号数

// 除以256int a = 2345;a = (a + 128) >> 8;

相关文章:

C++面向对象(OOP)编程-位运算详解

本文主要介绍原码、位运算的种类&#xff0c;以及常用的位运算的使用场景。 目录 1 原码、反码、补码 2 有符号和无符号数 3 位运算 4 位运算符使用规则 4.1 逻辑移位和算术移位 4.1.1 逻辑左移和算法左移 4.1.2 逻辑右移和算术右移 4.1.3 总结 4.2 位运算的应用场景 …...

linux运行服务提示报错/usr/bin/java: 没有那个文件或目录

如果是直接从官网下载的jdk解压安装&#xff0c;那么/usr/bin/没有java的软连接&#xff0c;即/usr/bin/java&#xff0c;所以即使在/etc/profile中配置了jdk的环境变量也没用&#xff0c;识别不到。 方法一&#xff1a;用java的执行路径配置/usr/bin/java软连接&#xff08;优…...

一篇文章教会你数据仓库之详解拉链表怎么做

前言 本文将会谈一谈在数据仓库中拉链表相关的内容&#xff0c;包括它的原理、设计、以及在我们大数据场景下的实现方式。 全文由下面几个部分组成&#xff1a; 先分享一下拉链表的用途、什么是拉链表。通过一些小的使用场景来对拉链表做近一步的阐释&#xff0c;以及拉链表和…...

C/S医院检验LIS系统源码

一、检验科LIS系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff…...

项目应用多级缓存示例

前不久做的一个项目&#xff0c;需要在前端实时展示硬件设备的数据。设备很多&#xff0c;并且每个设备的数据也很多&#xff0c;总之就是数据很多。同时&#xff0c;设备的刷新频率很快&#xff0c;需要每2秒读取一遍数据。 问题来了&#xff0c;我们如何读取数据&#xff0c…...

音视频技术开发周刊 | 325

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 AI读心术震撼登顶会&#xff01;模型翻译脑电波&#xff0c;人类思想被投屏&#xff5c;NeurIPS 2023 在最近举办的NeurIPS大会上&#xff0c;研究人员展示了当代AI更震撼…...

量化服务器 - 后台挂载运行

服务器 - 后台运行 pip3命令被kill 在正常的pip命令后面加上 -no-cache-dir tmux 使用教程 https://codeleading.com/article/40954761108/ 如果你希望在 tmux 中后台执行一个 Python 脚本&#xff0c;你可以按照以下步骤操作&#xff1a; 启动 tmux: tmux这将会创建一个新…...

使用tesla gpu 加速大模型,ffmpeg,unity 和 UE等二三维应用

我们知道tesla gpu 没有显示器接口&#xff0c;那么在windows中怎么使用加速unity ue这种三维编辑器呢&#xff0c;答案就是改变注册表来加速相应的三维渲染程序. 1 tesla gpu p40 p100 加速 在windows中使用regedit 来改变 核显配置&#xff0c; 让p100 p40 等等显卡通过核显…...

巅峰画师Midjourney:新时代的独角兽

介绍 AI绘画领域中&#xff0c;Midjourney处于绝对地位&#xff0c;并且一年时间就登顶。 Midjourney是一家独立的AI研究实验室,探索新的思维媒介,拓展人类的想象力。 它由一个小型的自筹资金团队组成,专注于设计、人类基础设施和AI。 在AI绘画领域,Midjourney取得了非常突出…...

入行 4 年,跳槽 2 次,我摸透了软件测试这一行!

最近几年行业在如火如荼的发展壮大&#xff0c;以及其他传统公司都需要大批量的软件测试人员&#xff0c;但是最近几年的疫情导致大规模裁员&#xff0c;让人觉得行业寒冬已来&#xff0c;软件测试人员的职业规划值得我们深度思考。 大家都比较看好软件测试行业&#xff0c;只是…...

Hive01_安装部署

Hive的安装 上传安装包 解压 tar zxvf apache-hive-3.1.2-bin.tar.gz mv apache-hive-3.1.2-bin hive解决Hive与Hadoop之间guava版本差异 cd /export/software/hive/ rm -rf lib/guava-19.0.jarcp cp /export/software/hadoop/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0…...

解决国内大模型痛点的最佳实践方案

1.前言 自AI热潮掀起以来&#xff0c;国内互联网大厂躬身入局&#xff0c;各类机构奋起追赶&#xff0c;创业型企业纷至沓来。业内戏称&#xff0c;一场大模型的“百模大战”已经扩展到“千模大战”。 根据近期中国科学技术信息研究所发布的《中国人工智能大模型地图研究报告…...

当文字成为雨滴:HTML、CSS、JS创作炫酷的“文字雨“动画!

简介 在本篇技术文章中&#xff0c;将介绍如何使用HTML、CSS和JavaScript创建一个独特而引人注目的"文字(字母&数字)"雨&#x1f327;️动画效果。通过该动画&#xff0c;展现出的是一系列随机字符将从云朵中下落像是将文字变成雨滴从天而降&#xff0c;营造出与…...

计算机网络简述

前言 计算机网路是一个很庞大的话题。在此我仅对其基础概述以及简单应用进行陈述。后续或有补充以形成完善的计算机网络知识体系。 一.计算机网络的定义 根据百度词条的描述&#xff0c;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过…...

Go 泛型之类型参数

Go 泛型之类型参数 文章目录 Go 泛型之类型参数一、Go 的泛型与其他主流编程语言的泛型差异二、返回切片中值最大的元素三、类型参数&#xff08;type parameters&#xff09;四、泛型函数3.1 泛型函数的结构3.2 调用泛型函数3.3 泛型函数实例化&#xff08;instantiation&…...

KafkaLog4jAppender

Apache Log4j 中有一个 Appender 概念&#xff0c;它负责将日志信息输出到各种目的地&#xff0c;例如控制台、文件、数据库等。KafkaLog4jAppender 是 Log4j 的一个扩展&#xff0c;它可以将日志信息发送到 Apache Kafka。 下面是如何在 Log4j 中使用 KafkaLog4jAppender 的一…...

IntelliJ IDEA插件

插件安装目录&#xff1a;C:\Users\<username>\AppData\Roaming\JetBrains\IntelliJIdea2021.2\plugins aiXcoder Code Completer&#xff1a;代码补全 Bookmark-X&#xff1a;书签分类 使用方法&#xff1a;鼠标移动到某一行&#xff0c;按ALT SHIFT D...

鸿蒙开发中的坑(持续更新……)

最近在使用鸿蒙开发时&#xff0c;碰到了一些坑&#xff0c;特做记录&#xff0c;如&#xff1a;鸿蒙的preview不能预览&#xff0c;轮播图组件Swiper使用时的问题&#xff0c;console.log() 打印的内容 一、鸿蒙的preview不能预览 首先&#xff0c;只有 ets文件才能预览。 其…...

单体项目-动态上下文问题

在HTML中使用Thymeleaf解决动态上下文问题&#xff0c;你可以使用Thymeleaf的模板语法来生成动态的链接&#xff08;例如CSS和JavaScript文件的链接&#xff09;以适应不同的应用程序上下文。以下是一个示例&#xff1a; <!DOCTYPE html> <html xmlns:th"http:/…...

Qt/QML编程学习之心得:实现一个图片浏览器(十八)

QML中有个重要控件,经常使用就是image,通常可以用它来显示一张图片。如果想结合openfiledialog来让image显示图片,也就是做一个简易的图片浏览器,怎么弄呢? DefaultFileDialog.qml: import QtQuick 2.0 import QtQuick.Dialogs 1.0FileDialog {id: fileDialogtitle: &qu…...

kafka发送大消息

1 kafka消息压缩 kafka关于消息压缩的定义&#xff08;来源于官网&#xff09;&#xff1a; 此为 Kafka 中端到端的块压缩功能。如果启用&#xff0c;数据将由 producer 压缩&#xff0c;以压缩格式写入服务器&#xff0c;并由 consumer 解压缩。压缩将提高 consumer 的吞吐量…...

React AntDesign form表单文件上传 nodejs formidable 接受参数并把文件放置后端项目相对目录指定文件夹下面

@umijs/max 请求方法 // 上传文件改成form表单 export async function uploadFile(data, options) {return request(CMMS_UI_HOST + /api/v1/uploadFile, {method: POST,data,requestType: form,...(options || {}),}); }前端调用方法 注意upload组件上传 onChange的如下方法,…...

设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列

系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式&#xff0c;5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式&#xff0c;每一种模式的概念、使用…...

css 实现满屏升空的气球动画

最终实现效果 demo放在最后了。。。。 问题一 怎么实现满屏气球&#xff1f;简单理解就是多个气球的合并&#xff0c;难道要写多个盒子吗&#xff1f;确实是这样子&#xff0c;但可以有更好的办法&#xff0c;其实就是通过原生操作多个盒子生成&#xff0c;所以只需要实现一个…...

批量归一化

目录 一、BN层介绍 1、深层神经网络存在的问题 2、批量归一化公式的数学推导 3、BN层的作用位置 4、 预测过程中的批量归一化 5、BN层加速模型训练的原因 6、总结 二、批量归一化从零实现 1、实现批量归一化操作 2、创建BN层 3、对LeNet加入批量归一化 4、开始训练…...

C语言:字符串字面量及其保存位置

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 虽然C语言中不存在字符串类型&#xff0c;但依然可以通过数组或指针的方式保存字符串&#xff0c;但字符串字面量却没有想象的这么简单&#xff0c;本文就将对此进行讨论…...

【开源】基于Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…...

共享和独享的区别是什么?有必要用独享IP吗?

通俗地讲&#xff0c;共享IP就像乘坐公共汽车一样&#xff0c;您可以到达目的地&#xff0c;但将与其他乘客共享旅程&#xff0c;座位很可能是没有的。独享IP就像坐出租车一样&#xff0c;您可以更快到达目的地&#xff0c;由于车上只有您一个人&#xff0c;座位是您一个人专用…...

leetcode——打家劫舍问题汇总

本章汇总一下leetcode中的打家劫舍问题&#xff0c;使用经典动态规划算法求解。 1、梦开始的地方——打家劫舍&#xff08;★&#xff09; 本题关键点就是不能在相邻房屋偷东西。 采用常规动态规划做法&#xff1a; 根据题意设定dp数组&#xff0c;dp[i]的含义为&#xff1a…...

Java经典框架之Spring MVC

Spring MVC Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring MVC 入门案例 2. 基…...

Golang make vs new

文章目录 1.简介2.区别3.new 可以初始化 slice&#xff0c;map 和 channel 吗&#xff1f;4.make 可以初始化其他类型吗&#xff1f;5.小结参考文献 1.简介 在 Go 语言中&#xff0c;make 和 new 是两个用于创建对象的内建函数&#xff0c;但它们有着不同的用途和适用范围。 …...

Arthas

概述 Arthas&#xff08;阿尔萨斯&#xff09; 能为你做什么&#xff1f; Arthas 是Alibaba开源的Java诊断工具&#xff0c;深受开发者喜爱。 当你遇到以下类似问题而束手无策时&#xff0c;Arthas可以帮助你解决&#xff1a; 这个类从哪个 jar 包加载的&#xff1f;为什么会…...

IP代理科普| 共享IP还是独享IP?两者的区别与优势

通俗地讲&#xff0c;共享IP就像乘坐公共汽车一样&#xff0c;您可以到达目的地&#xff0c;但将与其他乘客共享旅程&#xff0c;座位很可能是没有的。独享IP就像坐出租车一样&#xff0c;您可以更快到达目的地&#xff0c;由于车上只有您一个人&#xff0c;座位是您一个人专用…...

龙芯loongarch64服务器编译安装tensorflow-io-gcs-filesystem

前言 安装TensorFlow的时候,会出现有些包找不到的情况,直接使用pip命令也无法安装,比如tensorflow-io-gcs-filesystem,安装的时候就会报错: 这个包需要自行编译,官方介绍有限,这里我讲解下 编译 准备 拉取源码:https://github.com/tensorflow/io.git 文章中…...

开源持续测试平台Linux MeterSphere本地部署与远程访问

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…...

Kubernetes(K8S)快速入门

概述 在本门课程中&#xff0c;我们将会学习K8S一些非常重要和核心概念&#xff0c;已经操作这些核心概念对应组件的相关命令和方式。比如Deploy部署&#xff0c;Pod容器&#xff0c;调度器&#xff0c;Service服务&#xff0c;Node集群节点&#xff0c;Helm包管理器等等。 在…...

将遗留系统分解为微服务:第 2 部分

在当今不断发展的技术环境中&#xff0c;从整体架构向微服务的转变对于许多企业来说都是一项战略举措。这在报销计算系统领域尤其重要。正如我在上一篇文章第 1 部分应用 Strangler 模式将遗留系统分解为微服务-CSDN博客中提到的&#xff0c;让我们探讨如何有效管理这种转变。 …...

RK3588平台开发系列讲解(AI 篇)RKNN-Toolkit2 模型的加载转换

文章目录 一、Caffe 模型加载接口二、TensorFlow 模型加载接口三、TensorFlowLite 模型加载接口四、ONNX 模型加载五、DarkNet 模型加载接口六、PyTorch 模型加载接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 RKNN-Toolkit2 目前支持 Caffe、TensorFlow、Tensor…...

CNVD原创漏洞审核和处理流程

一、CNVD原创漏洞审核归档和发布主流程 &#xff08;一&#xff09;审核和归档流程 审核流程分为一级、二级、三级审核&#xff0c;其中一级审核主要对提交的漏洞信息完整性进行审核&#xff0c;漏洞符合可验证&#xff08;通用型漏洞有验证代码信息或多个互联网实例、事件型…...

【java爬虫】基于springboot+jdbcTemplate+sqlite+OkHttp获取个股的详细数据

注&#xff1a;本文所用技术栈为&#xff1a;springbootjdbcTemplatesqliteOkHttp 前面的文章我们获取过沪深300指数的成分股所属行业以及权重数据&#xff0c;本文我们来获取个股的详细数据。 我们的数据源是某狐财经&#xff0c;接口的详细信息在下面的文章中&#xff0c;本…...

智能优化算法应用:基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工兔算法4.实验参数设定5.算法结果6.参考文…...

【ubuntu 22.04】安装vscode并配置正常访问应用商店

注意&#xff1a;要去vscode官网下载deb安装包&#xff0c;在软件商店下载的版本不支持输入中文 在ubuntu下用火狐浏览器无法访问vscode官网&#xff0c;此时可以手动进行DNS解析&#xff0c;打开DNS在线查询工具&#xff0c;解析以下主机地址&#xff08;复制最后一个IP地址&a…...

K8s出现问题时,如何排查解决!

K8s问题的排查 1. POD启动异常、部分节点无法启动pod2. 审视集群状态3. 追踪事件日志4. 聚焦Pod状态5. 检查网络连通性6. 审视存储配置7. 研究容器日志8. K8S集群网络通信9. 问题&#xff1a;Service 是否通过 DNS 工作&#xff1f;10. 总结1、POD启动异常、部分节点无法启动p…...

2015年第四届数学建模国际赛小美赛B题南极洲的平均温度解题全过程文档及程序

2015年第四届数学建模国际赛小美赛 B题 南极洲的平均温度 原题再现&#xff1a; 地表平均温度是反映气候变化和全球变暖的重要指标。然而&#xff0c;在以前的估计中&#xff0c;在如何界定土地平均数方面存在一些方法上的差异。为简单起见&#xff0c;我们只考虑南极洲。请建…...

npm常见错误

三个方面 1. npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! phantomjs-prebuilt2.1.15 install: node install.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the phantomjs-prebuilt2.1.15 install script. np…...

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集 HotSpot虚拟机中的任何操作都需要入栈和出栈的步骤。 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。优点是跨平台&#xff0c;指令集小&#x…...

MS2244模拟开关可Pin to Pin兼容NJM2244

MS2244 是一款集成的视频开关&#xff0c;实现三输入视频或音频信号的三选一。可Pin to Pin兼容NJM2244。 芯片集成了 75Ω驱动电路&#xff0c;可以直接驱动电视监控器。芯片工作电压 5V&#xff5e;12V&#xff0c;带宽 10MHz&#xff0c;抗串扰 70dB (4.43MHz)。另外芯片还集…...

PostgreSQL 可观测性最佳实践

简介 软件简述 PostgreSQL 是一种开源的关系型数据库管理系统 (RDBMS)&#xff0c;它提供了许多可观测性选项&#xff0c;以确保数据库的稳定性和可靠性。 可观测性 可观测性&#xff08;Observability&#xff09;是指对数据库状态和操作进行监控和记录&#xff0c;以便在…...

51单片机相关寄存器

前言 单片机复习的时候对应寄存器的记忆感觉很混乱&#xff0c;这里进行一下整理,后面的单词是我用来辅助记忆的&#xff0c;可能并不是表示原本的含义。 P3口的第二功能 0RXD 串行数据输入口 1TXD串行数据输出口2INT0外部中断0输入3INT1外部中断1输入4T0定时器0外部计数输入…...

二叉树进阶题目(超详解)

文章目录 前言根据二叉树创建字符串题目分析写代码 二叉树的层序遍历题目分析 写代码二叉树的层序遍历II题目分析写代码 二叉树的最近公共祖先题目分析写代码时间复杂度 优化思路优化的代码 二叉搜索树与双向链表题目分析写代码 从前序与中序遍历序列构造二叉树题目分析写代码从…...