C语言 –位运算

C语言 –位运算总结一下 自己脑子短路时可以查看一下 一 位运算符 逻辑运算符 amp 位 与 位 异或 位 或 位 非 取反移位运算符 lt lt 左移 gt gt 右移逻辑位运算都是以 bit 为单位 二 非 取反位取反的操作符为 0 变成 1 1 变成 0 需要注意的是 位取反运算并不会改变操作数

总结一下,自己脑子短路时可以查看一下。

一,位运算符:

逻辑运算符:

  1. &:位 ‘与’ ;
  2. ^: 位 ‘异或’
  3. |: 位 ‘或’
  4. ~: 位 ‘非’,取反

移位运算符:

  1. <<: 左移
  2. >>: 右移

逻辑位运算都是以 (bit)为单位。

二: ‘~’ 非 ,取反

位取反的操作符为“~”,0变成1,1变成0,需要注意的是,位取反运算并不会改变操作数的值,它只是再内存中进行的。如果想要改变需要重新赋值。

#include 
  
    #include 
   
     void main() { unsigned char ch = 15; //0000 1111 unsigned char ch1 = ~ch; //1111 0000 unsigned char ch2 = ~ch1;//0000 1111 printf("%d,%d,%d", ch, ch1, ch2); system("pause"); } 
    
  
#include 
  
    #include 
   
     /* 取反操作, 不管是 8 位 16位 清除最后一位(末尾清零) & ~1 通用 */ void main(void) { unsigned char ch = 15; // 1111 1111 unsigned short sh = 16385; //0100 0000 0000 0001 ch = ch & ~1; sh = sh & ~1; printf("%d, %d \n", ch, sh); unsigned char ch1 = 1; // 0000 0001 --> 1111 1110 unsigned char ch2 = ~(~ch1); printf("%d , %d\n", ~ch1,ch2); system("pause"); } 
    
  

三:位 与 运算 &:

位与运算的操作符为&,1 & 1=1 1 & 0=0 0 & 1=0 0 & 0=0

#include 
  
    #include 
   
     void main() { //与运算 : 1 & 1 =1 ; 1 & 0 = 0 ; 0 & 1 = 0 ;0 & 0 = 0 (相同成立,不同不成立) unsigned char ch1 = 3; // 0000 0011 unsigned char ch2 = 240; // 1111 0000 unsigned char ch3 = 255; // 1111 1111 printf("%d", ch1 & ch2); printf("\n%d", ch1 & ch3); printf("\n"); system("pause"); } 
    
  
//实现安位清零 二进制位与0相与执行清零动作 void main() { unsigned char ch = 255; //1111 1111 unsigned char ch1 = 15; //0000 1111 unsigned char ch2 = 240; //1111 0000 //清零高4位 printf("%d", ch & ch1); //清零低4位 printf("\n%d\n", ch & ch2); system("pause"); } 
  1. 0 –
  2. 最大16进制标识为:0xFFFF FFFF
  3. 二进制:1111 1111 1111 1111 1111 1111 1111 1111

有符号为:int 类型 数据范围

  1. – –
  2. 最大16进制标识为 0x7FFF FFFF
  3. 二进制:0111 1111 1111 1111 1111 1111 1111 1111 (最前面为符号位 0正数,1负数)

在这里插入图片描述
与1相与 值不变 获取指定位:

//获取指定位 二进制位与1相与保持某些位不变。 void main() { unsigned char ch = 169; // 1010 1001 //获取中间四位 unsigned char ch1 = 60; // 0011 1100 /* 1010 1001 & 0011 1100 0010 1000 */ printf("%d", ch & ch1); //获取前5位 unsigned char ch2 = 248; //1111 1000 /* 1010 1001 & 1111 1000 ------------------ 1010 1000 */ printf("\n%d\n", ch & ch2); system("pause"); } 

在这里插入图片描述

四:位 或 | 运算

#include 
  
    #include 
   
     void main() { //或运算:1|1=1 ,1|0=1 ,0|1 =1 ,0|0=0 unsigned char ch = 169; //1010 1001 unsigned char ch1 = 240; //1111 0000 /* 1010 1001 | 1111 0000 -------------------- 1111 1001=(249)10 */ printf("%d", ch | ch1); putchar('\n'); system("pause"); } 
    
  

在这里插入图片描述

//或运算 :与1相或 都变成1 ;1|1=1 1|0=1 //与0相或 结果不变 0|1=1 0|0=0 void main() { unsigned char ch = 169; //1010 1001 unsigned char ch2 = 15; //0000 1111 /* 1010 1001 | 0000 1111 --------------- 1010 1111=(175)10 */ printf("%d", ch | ch2); putchar('\n'); system("pause"); } 

在这里插入图片描述

五:位 异或 ^

#include 
  
    #include 
   
     //异或运算 : 1^1=0 ; 0^0=0 ; 1^0=1 ; 0^1=1 (相同为0 不同为1) void main() { unsigned char ch = 169; //1010 1001 unsigned char ch2 = 15; //0000 1111 /* 1010 1001 ^ 0000 1111 ---------------- 1010 0110 */ printf("%d", ch ^ ch2); putchar('\n'); system("pause"); } 
    
  

在这里插入图片描述
实现反转: 异或可以实现反转 :与1相异或 1^1=0 ,0 ^ 1 =1 。无论是0 或 1 与1相异或都会发生逆转

//异或可以实现反转 :与1相异或 1^1=0 0^1=1 //无论是0 或 1 与1相异或都会发生逆转 void main() { unsigned char ch = 169; //1010 1001 unsigned char ch1 = 255; //1111 1111 /* 1010 1001 ^ 1111 1111 ---------------- 0101 0110 */ printf("%d", ch ^ ch1); putchar('\n'); system("pause"); } 

在这里插入图片描述

//指定位反转 //与0相异或保持不变 :0^0=0 0^1=1 无论是 1或0 与0发生相异或都不会变化 void main() { unsigned char ch = 255; //1111 1111 unsigned char ch1 = 60; //0011 1100 /*反转中间4位 1111 1111 ^ 0011 1100 ---------------- 1100 0011=(195)10 */ printf("%d", ch ^ ch1); putchar('\n'); system("pause"); } 

在这里插入图片描述

//异或实现交换两个变量 void main() { unsigned char ch1 = 20; // 0001 0100 unsigned char ch2 = 10; // 0000 1010 printf("交换前 :%d ,%d", ch1, ch2); ch1 = ch1 ^ ch2; /* 0001 0100 ^ 0000 1010 ---------------- 0001 1110 =ch1 */ ch2 = ch2 ^ ch1; /* 0000 1010 ^ 0001 1110 ---------------- 0001 0100 =ch2 */ ch1 = ch1 ^ ch2; /* 0001 1110 ^ 0001 0100 ---------------- 0000 1010 =ch1 */ //-->ch1=0000 1010 //-->ch2=0001 0100 printf("\n交换后 :%d ,%d", ch1, ch2); putchar('\n'); system("pause"); } 

在这里插入图片描述

移位运算 ‘<<’ 左移 和 ‘>>’ 右移

#include 
  
    #include 
   
     /* 左移 << 右移 >> */ void main1() { unsigned char ch = 1; // 0000 0001 printf("%d", ch << 1); //0000 0010 printf("\n%d", ch << 3); printf("\n%d", ch );//左移位不会改变原来的值 printf("\n%d", ch=(ch<<4));//通过赋值符号改变原来的值 ,左移一位 等价与乘以2 system("pause"); } 
    
  

在这里插入图片描述

//左移注意数据溢出 void main() { unsigned char ch = 1; // 0000 0001 printf("%d\n", ch << 7); //0100 0000 输出64 printf("%d", ch << 8); //1 0000 0000 输出256 ,数据长度超过 char类型的长度,读取不到 ch = (ch << 8); printf("\n%d", ch); //输出0 数据长度超过 char类型的长度,读取不到 system("pause"); } 

在这里插入图片描述

void main() { unsigned char ch = 128; // 1000 0000 printf("%d\n", ch >> 1); printf("%d\n", ch >> 2); printf("%d\n", ch); //右移操作也不会改变原来变量的值。 移位运算是在CPU寄存器中操作的 ch = (ch >> 2); //通过赋值操作符改变原来的值 ,右移一位等价与除以2 printf("%d\n", ch); system("pause"); } 

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205076.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:52
下一篇 2026年3月19日 下午6:52


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号