核心内容摘要
Paraformer-large + ffmpeg集成教程:音频格式自动转换实战
位运算百度百科如下:程序中的所有数在计算机内存中都是以二进制的形式储存的。
位运算就是直接对整数在内存中的二进制位进行操作位操作的优势位运算是一种底层的运算往往比我们普通的运算要快上许多许多位运算是最高效而且占用内存最少的算法操作执行效率非常高位运算操作的是二进制数会拥有一些二进制的特性在实际问题可以方便运用位运算只需较低的空间需求位运算使用能使程序变得更加简洁和优美位运算可以表示一些状态集合运算符号下面的a和b都是整数类型则含义C语言按位与a b按位或a | b按位异或a ^ b按位取反~a左移a b带符号右移a b无符号右移num (1 N)优先级C语言中位运算符之间按优先级顺序排列为优先级符号1~
34^5|
^、|、、概念简介以及技巧本文会以C语言的交互环境来做代码演示常见的二进制位的变换操作and运算符 判断奇偶数对于除0以外的任意数x使用x11作为逻辑判断即可if (x
{ }判断某个二进制位是否为1比如第7位, 0x40转到二进制是0100 0000,代表第7位是
if (n0x
{ //TODO:添加你要处理的代码 }字节读取(x
0x000000ff /* 获取第0个字节 */ (x
0x000000ff /* 获取第1个字节 */ (x
0x000000ff /* 获取第2个字节 */ (x
0x000000ff /* 获取第3个字节 */判断一个数是不是 2 的指数bool isPowerOfTwo(int n) { if (n
return false; return (n (n -
) 0; }取余(除数为2的n次方)//得到余数 int Yu(int num,int n) { int i 1 n; return num(i-
; }指定二进制位数截取比如说16位二进制数A1001 1001 1001 1000如果来你想获A的哪一位的值,就把数字B0000 0000 0000 0000的那一位设置为
比如说我想获得A的第三位就把B的第三位数字设置为1则B为0000 0000 0000 0100设置完之后再把A、B求与 其结果若为0说明A的第三位为0其结果为1说明A的第三位为
同理若要获得A的第五位就把B设置为0000 0000 0001 0000之后再求与。
通常在我们的程序中数字B被称为掩码其含义是专门用来测试某一位是否为0的数值。
统计二进制中 1 的个数利用xx(x-
会将x用二进制表示时最右边的一个1变为0因为x-1会将该位变为
int Count(int x) { int sum0; while(x) { sum; xx(x-
; } return sum; }or操作符 |生成组合编码进行状态压缩当把二进制当作集合使用时可以用or操作来增加元素。
合并编码 在对字节码进行加密时加密后的两段bit需要重新合并成一个字节这时就需要使用or操作。
求一个数的二进制表达中0的个数int Grial(int x) { int count 0; while (x
{ count; x | (x
; } return count; }xor操作符 ^两个整数交换变量名void swap(int a, int b) { a ^ b; b ^ a; a ^ b; }异或的本质不同为1相同为0x是二进制数0101 y是二进制数1011 则结果为x^y1110 0^000^111^011^10判断两个数是否异号int x -1, y 2; bool f ((x ^ y)
; // true int x 3, y 2; bool f ((x ^ y)
; // false数据加密将需要加密的内容看做A密钥看做BA ^ B加密后的内容C。
而解密时只需要将C ^ 密钥B原内容A。
如果没有密钥就不能解密#include stdio.h #include stdlib.h #include string.h #define KEY 0x86 int main() { char p_data[16] {Hello World!}; char Encrypt[16]{0},Decode[16]{0}; int i; for(i 0; i strlen(p_data); i) { Encrypt[i] p_data[i] ^ KEY; } for(i 0; i strlen(Encrypt); i) { Decode[i] Encrypt[i] ^ KEY; } printf(Initial date: %s\n,p_data); printf(Encrypt date: %s\n,Encrypt); printf(Decode date: %s\n,Decode); return 0; }数字判重利用了二进制数的性质x^y^y x。
我们可见当同一个数累计进行两次xor操作相当于自行抵销了,剩下的就是不重复的数找出没有重复的数int find(int[] arr){ int tmp arr[0]; for(int i 1;i arr.length; i){ tmp tmp ^ arr[i]; } return tmp; }not操作交换符号int reversal(int a) { return ~a 1; }取绝对值效率高n31 取得n的符号若n为正数n31等于0若n为负数n31等于-1若n为正数 n^00,数不变若n为负数,有n^-1 需要计算n和-1的补码然后进行异或运算结果n变符号并且为n的绝对值减1再减去-1就是绝对值int abs(int n) { return (n ^ (n
) - (n
; }也可以这样使用int abs(int n) { int i n 31; return i 0 ? n : (~n
; }从低位到高位.将n的第m位置1将1左移m-1位找到第m位得到
..
..000, n在和这个数做或运算int setBitToOne(int n, int m) { return n | (1 (m-
); }同理从低位到高位,将n的第m位置0,代码如下int setBitToZero(int n, int m) { return n ~(1 (m-
); }shl操作 shr操作求2的N次方1n高低位交换unsigned short a 34520; a (a
| (a
;进行二进制逆序unsigned short a 34520; a ((a 0xAAAA)
| ((a 0x
5555)
; a ((a 0xCCCC)
| ((a 0x
3333)
; a ((a 0xF0F
0)
| ((a 0x0F0F)
; a ((a 0xFF
00)
| ((a 0x00FF)
;获得int型最大最小值int getMaxInt() { return (1
- 1;//2147483647 由于优先级关系括号不可省略 } int getMinInt() { return 1 31;//-2147483648 }m的n次方//自己重写的pow()方法 int pow(int m , int n){ int sum 1; while(n !
{ if(n 1
{ sum * m; } m * m; n n 1; } return sum; }找出不大于N的最大的2的幂指数int findN(int n){ n | n 1; n | n 2; n | n 4; n | n 8 // 整型一般是 32 位上面我是假设 8 位。
return (n
1; }二分查找32位整数的前导0个数int nlz(unsigned x) { int n; if (x
return(
; n 1; if ((x
16)
{n n 16; x x 16;} if ((x
24)
{n n 8; x x 8;} if ((x
28)
{n n 4; x x 4;} if ((x
30)