stm32C语⾔怎么分割图像,位操作运算——以C语⾔的交互环
境来做代码演⽰
百度百科如下:程序中的所有数在计算机内存中都是以⼆进制的形式储存的。位运算就是直接对整数在内存中的⼆进制位进⾏操作位操作的优
势位运算是⼀种底层的运算,往往⽐我们普通的运算要快上许多许多
位运算是最⾼效⽽且占⽤内存最少的算法操作,执⾏效率⾮常⾼
位运算操作的是⼆进制数,会拥有⼀些⼆进制的特性,在实际问题可以⽅便运⽤
位运算只需较低的空间需求
位运算使⽤能使程序变得更加简洁和优美
位运算可以表⽰⼀些状态集合运算符号
下⾯的a和b都是整数类型,则:含义C语⾔
按位与a&b
按位或a|b
按位异或a^b
按位取反~a
左移a<
带符号右移a>>b
⽆符号右移优先级
C语⾔中位运算符之间,按优先级顺序排列为优先级符号
1~
2<>
3&
4^
5|
6&=、^=、|=、<<=、>>=概念简介以及技巧本⽂会以C语⾔的交互环境来做代码演⽰
常见的⼆进制位的变换操作
微信图⽚_(42.49KB,下载次数:1)
2020-6-1120:36上传
and运算&判断奇偶数
对于除0以外的任意数x,使⽤x&1==1作为逻辑判断即可if(x&1==1)
{
}
判断某个⼆进制位是否为1
⽐如第7位,0x40转到⼆进制是01000000,代表第7位是(n&0x40)
{
//TODO:添加你要处理的代码
}
字节读取(x>>0)&0x000000ff/*获取第0个字节*/
(x>>8)&0x000000ff/*获取第1个字节*/
(x>>16)&0x000000ff/*获取第2个字节*/
(x>>24)&0x000000ff/*获取第3个字节*/
判断⼀个数是不是22的指数boolisPowerOfTwo(intn){
if(n<=0)returnfal;
return(n&(n-1))==0;
}
取余//得到余数
intYu(intnum,intn)
{
inti=1<
returnnum&(i-1);
}
指定⼆进制位数截取
⽐如说16位⼆进制数A:1000,如果来你想获A的哪⼀位的值,就把数字B:0000的那⼀位设置
为1.
⽐如说我想获得A的第三位就把B的第三位数字设置为1,则B为0100,设置完之后再把A、B求与,其结果若为0,说
明A的第三位为0,其结果为1,说明A的第三位为1.
同理:若要获得A的第五位,就把B设置为0000,之后再求与。
通常在我们的程序中,数字B被称为掩码,其含义是专门⽤来测试某⼀位是否为0的数值。统计⼆进制中1的个数
利⽤x=x&(x-1),会将x⽤⼆进制表⽰时最右边的⼀个1变为0,因为x-1会将该位变为nt(intx)
{intsum=0;
while(x)
{sum++;
x=x&(x-1);
}
returnsum;
}
or操作⽣成组合编码,进⾏状态压缩
当把⼆进制当作集合使⽤时,可以⽤or操作来增加元素。合并编码在对字节码进⾏加密时,加密后的两段bit需要重新合并成⼀个字节,这
时就需要使⽤or操作。求⼀个数的⼆进制表达中0的个数intGrial(intx)
{
intcount=0;
while(x+1)
{
count++;
x|=(x+1);
}
returncount;
}
xor操作两个整数交换变量名voidswap(int&a,int&b){
a^=b;
b^=a;
a^=b;
}
判断两个数是否异号intx=-1,y=2;
boolf=((x^y)<0);//true
intx=3,y=2;
boolf=((x^y)<0);//fal
数据加密
将需要加密的内容看做A,密钥看做B,A^B=加密后的内容C。⽽解密时只需要将C^密钥B=原内容A。如果没有密钥,就不能解
密!#include
#include
#include
#defineKEY0x86
intmain()
{
charp_data[16]={"HelloWorld!"};
charEncrypt[16]={0},Decode[16]={0};
inti;
for(i=0;i
{
Encrypt=p_data^KEY;
}
for(i=0;i
{
Decode=Encrypt^KEY;
}
printf("Initialdate:%sn",p_data);
printf("Encryptdate:%sn",Encrypt);
printf("Decodedate:%sn",Decode);
return0;
}数字判重
利⽤了⼆进制数的性质:x^y^y=x。我们可见,当同⼀个数累计进⾏两次xor操作,相当于⾃⾏抵销了,剩下的就是不重复的数找出没有重
复的数intfind(int[]arr){
inttmp=arr[0];
for(inti=1;i<;i++){
tmp=tmp^arr;
}
returntmp;
}not操作交换符号intreversal(inta){
return~a+1;
}
取绝对值(效率⾼)n>>31取得n的符号
若n为正数,n>>31等于0
若n为负数,n>>31等于-1
若n为正数n^0=0,数不变
若n为负数,有n^-1需要计算n和-1的补码,然后进⾏异或运算,结果n变符号并且为n的绝对值减1,再减去-1就是绝对值intabs(intn)
{
return(n^(n>>31))-(n>>31);
}
也可以这样使⽤intabs(intn)
{
inti=n>>31;
returni==0?n:(~n+1);
}
从低位到⾼位.将n的第m位置1
将1左移m-1位找到第m位,得到000...1...000,n在和这个数做或运算inttBitToOne(intn,intm)
{
returnn|(1<<(m-1));
}
同理从低位到⾼位,将n的第m位置0,代码如下inttBitToZero(intn,intm)
{
returnn&~(1<<(m-1));
}
shl操作&shr操作求2的N次⽅1<
⾼低位交换unsignedshorta=34520;
a=(a>>8)|(a<<8);
进⾏⼆进制逆序unsignedshorta=34520;
a=((a&0xAAAA)>>1)|((a&0x5555)<<1);
a=((a&0xCCCC)>>2)|((a&0x3333)<<2);
a=((a&0xF0F0)>>4)|((a&0x0F0F)<<4);
a=((a&0xFF00)>>8)|((a&0x00FF)<<8);
获得int型最⼤最⼩值intgetMaxInt()
{
return(1<<31)-1;//2147483647,由于优先级关系,括号不可省略
}
intgetMinInt()
{
return1<<31;//-2147483648
}
m的n次⽅//⾃⼰重写的pow()⽅法
intpow(intm,intn){
intsum=1;
while(n!=0){
if(n&1==1){
sum*=m;
}
m*=m;
n=n>>1;
}
returnsum;
}
找出不⼤于N的最⼤的2的幂指数intfindN(intn){
n|=n>>1;
n|=n>>2;
n|=n>>4;
n|=n>>8//整型⼀般是32位,上⾯我是假设8位。
return(n+1)>>1;
}
⼆分查找32位整数的前导0个数intnlz(unsignedx)
{
intn;
if(x==0)return(32);
n=1;
if((x>>16)==0){n=n+16;x=x<<16;}
if((x>>24)==0){n=n+8;x=x<<8;}
if((x>>28)==0){n=n+4;x=x<<4;}
if((x>>30)==0){n=n+2;x=x<<2;}
n=n-(x>>31);
returnn;
}
位图的操作
将x的第n位置1,可以通过x|=(x<
将x的第n位清0,可以通过x&=~(1<
取出x的第n位的值,可以通过(x>>n)&1来实现get_bit(charx,intn);
如下:#defineclr_bit(x,n)((x)&=~(1<<(n)))
#definet_bit(x,n)((x)|=(1<<(n)))
#defineget_bit(x,n)(((x)>>(n))&1)
综合应⽤
以下仅列出,感兴趣可以参考下⾯链接.
关于操作计数⽅法
计算整数的符号
检测两个整数是否具有相反的符号
计算⽆分⽀的整数绝对值(abs)
计算两个整数的最⼩值(最⼩值)或最⼤值(最⼤值),⽽⽆需分⽀
确定整数是否为2的幂
标志延伸从恒定位宽扩展的符号
从可变位宽扩展的符号
通过3个操作从可变位宽扩展符号有条件地设置或清除位⽽不分⽀
有条件地否定⼀个值⽽不分⽀
根据掩码合并两个值中的位
计数位设置计数位设置,幼稚的⽅式
计算由查找表设置的位
数位集,BrianKernighan的⽅式
使⽤64位指令对14、24或32位字中设置的位进⾏计数
并⾏设置计数位
从最⾼有效位到给定位置的计数位的设置(等级)
从给定的计数(等级)中选择位位置(从最⾼有效位开始)
计算奇偶校验(如果设置了奇数位数,则为1,否则为0)天真地计算单词的奇偶性
通过查找表计算奇偶校验
使⽤64位乘法和模数除法计算字节的奇偶校验
⽤乘法计算单词的奇偶校验
并⾏计算奇偶校验
交换价值⽤减法和加法交换值
⽤XOR交换值
⽤XOR交换单个位
反转位序列反转位是显⽽易见的⽅式
逐字查找表中的位反转
通过3个操作(64位乘法和模数除法)反转字节中的位
通过4个操作反转字节中的位(64位乘法,⽆除法)
通过7个操作反转字节中的位(⽆64位,仅32位)
与5*lg(N)个运算并⾏地反转N位数量
模数除法(⼜名计算余数)在不进⾏除法运算的情况下,将模数除以1<
在不进⾏除法运算的情况下以(1<
不进⾏除法运算就并⾏计算(1<
查找整数的整数对数2(⼜称最⾼位集的位置)使⽤O(N)运算找到MSBN设置为整数的对数2(显⽽易见的⽅法)
查找具有64位IEEE浮点数的整数的整数对数2
使⽤查找表找到整数的对数2
在O(lg(N))运算中找到N位整数的对数2
使⽤乘法和查找在O(lg(N))操作中找到N位整数的对数2
查找整数的对数以10为底的整数
查找整数的整数对数10
查找32位IEEE浮点数的整数对数基数2
查找32位IEEE浮点的pow(2,r)根的整数对数基数2(对于⽆符号整数r)
计算连续的尾随零位(或查找位索引)线性计算右边的连续零位(后缀)
并⾏计算右侧连续的零位(后缀)
通过⼆进制搜索计算右边连续的零位(跟踪)
通过强制转换为浮点数来计算右侧连续的零位(跟踪)
⽤模数除法和查找计算右边连续的零位(跟踪)
⽤乘法和查找计数右边连续的零位(后跟)
通过浮法舍⼊到2的下⼀个最⾼幂
向上舍⼊到2的下⼀个最⾼幂
交织位(也称为计算莫顿数)交错位的明显⽅式
通过表查找交织位
带64位乘法的交织位
通过⼆进制幻数交错位
测试单词中的字节范围(并计算出现的次数)确定单词是否为零字节
确定⼀个单词的字节数是否等于n
确定⼀个单词的字节数是否⼩于n
确定单词的字节数是否⼤于n
确定单词是否在m和n之间有⼀个字节
按词典顺序计算下⼀位排列
本文发布于:2022-12-08 01:35:50,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/63051.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |