总结一下,自己脑子短路时可以查看一下。
一,位运算符:
逻辑运算符:
- &:位 ‘与’ ;
- ^: 位 ‘异或’
- |: 位 ‘或’
- ~: 位 ‘非’,取反
移位运算符:
- <<: 左移
- >>: 右移
逻辑位运算都是以 (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"); }
- 0 –
- 最大16进制标识为:0xFFFF FFFF
- 二进制:1111 1111 1111 1111 1111 1111 1111 1111
有符号为:int 类型 数据范围
- – –
- 最大16进制标识为 0x7FFF FFFF
- 二进制: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
