以下代码都经过了验证,
#include <stdio.h>
int main(void)
{
int a = (0xF << 5);
printf("%x", ~a);
return 0;
}
位运算实战1
给定整型数a,设置a的bit3,保证其他位为0
#include <stdio.h>
int main(void)
{
int a = 0x00000000;
int b = a | (1 << 3);
printf("%x", b);
return 0;
}
位运算实战2
给定整型数a,设置a的bit3~bit7为1,保持其他位不变
#include <stdio.h>
int main(void)
{
int a = 0x00000000;
int b = a | (0x1F << 3);
printf("%x", b);
return 0;
}
位运算实战3
给定整型数a,清除a的bit15,保持其他位不变
#include <stdio.h>
int main(void)
{
int a = 0xFFFFFFFF;
a = a &(~(1<<15));
printf("%x", a);
return 0;
}
//位运算实战4
//给定整型数a,清除a的bit15,保持其他位不变
#include <stdio.h>
int main(void)
{
int a = 0xFFFFFFFF;
a = a & (~(1 << 15));
printf("%x", a);
return 0;
}
//位运算实战5
//给定整型数a,清除a的bit15~bit23,保持其他位不变
#include <stdio.h>
int main(void)
{
int a = 0xFFFFFFFF;
a = a & (~(0x1ff<< 15));
printf("%x", a);
return 0;
}
//位运算实战6
//给定整型数a,取出a的bit3~bit8
#include <stdio.h>
int main(void)
{
int a = 0xFFFFFFFF;
a &=(0x3f<<3);
a >>= 3;
printf("%x", a);
return 0;
}
//位运算实战7
//用C语言给寄存器的bit7~bit17赋值937,并且其余位不受影响
#include <stdio.h>
int main(void)
{
int a = 0xFFFFFFFF;
a &= (~(0x7ff << 7));
a|=(937<<7);
printf("%x", a);
return 0;
}
//位运算实战8
//用C语言给寄存器a的bit7~bit17的值加上937,并且其余位不受影响
#include <stdio.h>
int main(void)
{ //第一步:先读出原来bit7-bit17的数值
//第二步:在这个值的基础上加上17
//第三步:将bit7-bit17清零
//第四步:将第二步算出来的值写回到bit7-bit17中
int a = 0xFFFFFFFF;
int tmp = (a & ~(0x7ff << 7)); //将bit7~bit17以外的其他位都清零
tmp >> 7; //右移7位得到bit7-bit17的值
tmp += 17; //加上17
a &= ~(0x7ff << 7);
a|=tmp<<7;
printf("%x", a);
return 0;
}
//位运算实战8
//用C语言给寄存器的bit7~bit17赋值937,同时给bit21-bit25赋值17,并且其余位不受影响
#include <stdio.h>
int main(void)
{
int a = 0xFFFFFFFF;
a &=~ (0x7ff << 7) | (0x1f << 21); //将题目中的位全部清零
a |= (937 << 7) | (17 << 21); //一步到位,直接赋值后写回去
printf("%x", a);
return 0;
}
//位运算实战9
//用宏来进行置位操作,注意,这里的bit0算做第一位
#define SET_BIT_N(x,n) ((x)|(1<<((n)-1)))
#include <stdio.h>
int main(void)
{
int x = 0x00000000;
printf("%x", SET_BIT_N(x, 3));
return 0;
}
//位运算实战10
//用宏来进行复位操作,注意,这里的bit0算做第一位
#define CLR_BIT_N(x,n) ((x)&~(1<<((n)-1)))
#include <stdio.h>
int main(void)
{
int x = 0x000000FF;
printf("%x", CLR_BIT_N(x, 3));
return 0;
}
//位运算实战11
//用宏来进行截取变量的部分连续位操作,注意,这里的bit0算做第一位
#define GETBITS(x,n,m) ((x &~(~(0U))<<(m-n+1))<<(n-1)>>(n-1))
#include <stdio.h>
int main(void)
{
int x = 0x000000FF;
printf("%x", GETBITS(x, 3,5));
return 0;
}