C语言位运算

#include <stdio.h>


// & 位且
//11 1 
//01 0
//10 0
//00 0


// 1001 0011 
// 1111 0000
// 1001 0000
//&无论是0还是1 和0相&结果就为0
//无论是1还是0  和1相&结果就不变


//xxxx xxxx
//1111 0111 //那么第五个就一定是0


/*

   x          y

1010 1011 //取y坐标
0000 1111
0000 1011 //取出y坐标


1010 1011 //取x坐标
1111 0000 
1010 0000 //取出x坐标
右移4位
*/
void main1()
{
unsigned int ch=255;//1111 1111 
unsigned int nch=15;//0000 1111
//0000 1111
unsigned int rch=ch&nch;
printf("%d\n",rch);

}


#include <stdio.h>




// | 位或
// 11 1
// 01 1  | 上1就变成1


// 10 1
// 00 0  | 上0就不变
// XXXX XXXX
// 0000 1000//第五位一定为1






// |无论是0还是1|上1就会变成1
// |无论中0还是1|上0就不变
void main3()
{
unsigned int ch=255;//1111 1111 
unsigned int nch=15;//0000 1111
//1111 1111
unsigned int rch=ch|nch;
printf("%d\n",rch);


}

#include <stdio.h>


//^ 异或
// 11 0 
// 01 1
// 10 1
// 00 0
//同性为0  负性为1


//11 0
//01 1
//无论1还是0 只要与0相异或就不会变化
//要是异或1那么就为反转
// 1011 0111
// 0000 1111
// 1011 1000 //将5到8位进行反转
void mainA()
{
unsigned int ch=255;//1111 1111 
//unsigned int nch=15;//0000 1111
//1111 0000
unsigned int nch=0;//0000 1111
unsigned int rch=ch^nch;
printf("%d\n",rch);


}


void mainB() //交换数据
{
int a=10;
int b=20;
printf("a=%d,b=%d\n",a,b);
a=a^b; 
//0000 1010
//0001 0100
//0001 1110 a=0001 1110
b=a^b;
//0001 1110
//0001 0100
//0000 1010 b=0000 1010
a=a^b;
//0001 1110
//0000 1010
//0001 0100 a=0001 0100
printf("a=%d,b=%d\n",a,b);



}



#include <stdio.h>




void main2()
{

// 1 在你内存就是4个字节 32位 
// 0000 0000 0000 0000 0000 0000 0000 0001
// 1111 1111 1111 1111 1111 1111 1111 1110
//ch赋值时赋值号进行了转换
{
unsigned char ch=~1; //将小类型保存大类型就会被截断
//取反
// 0000 0001
// 1111 1110
printf("%d\n",ch);
}


{
unsigned int a=~1;
printf("%u\n",a);
}



}


#include <stdio.h>




void mainC() //右移
{
int a=1;
//0000 0001
//0000 0000 1 //结果为0 

int b=1000;
//右移就说明除以2
printf("%d\n",a>>1);
printf("%d\n",b>>1);
printf("%d\n",b>>2);
printf("%d\n",b>>3);
printf("%d\n",b>>4);
}




void mainD()
{
//int a=11;
//0000 1011
//0001 0110

//0000 0001   255
//1 0000 000  256  //位移越界保留左边 
unsigned int a=1;
//左移就说明乘以2
printf("%d\n",a<<1);
printf("%d\n",a<<2);
printf("%d\n",a<<3);
printf("%d\n",a<<4);
printf("%d\n",a<<5);
printf("%u\n",a<<32);
}


#include <stdio.h>


void main()
{
unsigned char ch1=1; //0000 0001
unsigned char ch2=3;//0000  0011
unsigned char ch3=ch1&ch2; //ch1 & ch2 结果保存在寄存器EAX
ch1&=ch2; //ch1变化了寄存器的结果赋值给内存
ch1^=ch2;// ch1=ch1^ch2
ch1|=ch2;//ch1=ch1|ch2
ch1>>=ch2;//ch1=ch1>>ch2
ch1<<=ch2;//ch1=ch1<<ch2
//ch1<< =ch2
//符合赋值运算符中间不可以加空格
//ch1~=ch2;//~取反运算符是单目运算符不可以进行符合赋值运算




}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言提供了位运算符,用于对二进制数据进行位级操作。以下是常用的位运算符: - 位与(&):两个操作数的对应位都为1,则对应结果为1,否则为0。 - 位或(|):两个操作数的对应位有一个为1,则对应结果为1,否则为0。 - 位异或(^):两个操作数的对应位不相同,则对应结果为1,否则为0。 - 位取反(~):对操作数的每个位取反,即0变成1,1变成0。 - 左移(<<):将操作数的所有位向左移动指定的位数,右侧空出的位用0填充。 - 右移(>>):将操作数的所有位向右移动指定的位数,左侧空出的位用符号位填充(对于有符号数),或用0填充(对于无符号数)。 下面是一个简单的示例,展示了如何使用位运算符: ```c #include <stdio.h> int main() { unsigned int a = 60; // 二进制为 0011 1100 unsigned int b = 13; // 二进制为 0000 1101 int c = 0; c = a & b; // 二进制为 0000 1100 printf("a & b = %d\n", c); c = a | b; // 二进制为 0011 1101 printf("a | b = %d\n", c); c = a ^ b; // 二进制为 0011 0001 printf("a ^ b = %d\n", c); c = ~a; // 二进制为 1100 0011 printf("~a = %d\n", c); c = a << 2; // 二进制为 1111 0000 printf("a << 2 = %d\n", c); c = a >> 2; // 二进制为 0000 1111 printf("a >> 2 = %d\n", c); return 0; } ``` 输出将显示: ``` a & b = 12 a | b = 61 a ^ b = 49 ~a = 4294967235 a << 2 = 240 a >> 2 = 15 ``` 这个示例展示了如何使用位运算符进行位级操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值