大家好,欢迎来到IT知识分享网。
总结一下,自己脑子短路时可以查看一下。
一,位运算符:
逻辑运算符:
- &:位 ‘与’ ;
- ^: 位 ‘异或’
- |: 位 ‘或’
- ~: 位 ‘非’,取反
移位运算符:
- <<: 左移
- >>: 右移
逻辑位运算都是以 (bit)为单位。
二: ‘~’ 非 ,取反
位取反的操作符为“~”,0变成1,1变成0,需要注意的是,位取反运算并不会改变操作数的值,它只是再内存中进行的。如果想要改变需要重新赋值。
#include<stdio.h>
#include<stdlib.h>
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<stdio.h>
#include<stdlib.h>
/*
取反操作,
不管是 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<stdio.h>
#include<stdlib.h>
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相与都是0 ,可以实现按位清零
//实现安位清零 二进制位与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");
}
在C#中 & 操作默认返回 int 类型。要取分有符号和无符号 int 类型。
无符号为:uint 类型 数据范围
- 0 – 4294967295
- 最大16进制标识为:0xFFFF FFFF
- 二进制:1111 1111 1111 1111 1111 1111 1111 1111
有符号为:int 类型 数据范围
- -2147483648 – 2147483647
- 最大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");
}
四:位 或 | 运算
位或运算的操作符为|,将对两个操作数的每一位进行或运算,位“或”运算的准则如下:
1 | 1=1 1 | 0=1 0 | 1=1 0 | 0=0
#include<stdio.h>
#include<stdlib.h>
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");
}
五:位 异或 ^
位异或运算的操作符为^,将对两个操作数的每一位进行异或运算。通俗地讲,如果位“异或”运算的两个位相同(同为0或同为1),结果为0,若两个位不同(一个为0,另一个为1),结果为1,对应的准则为:
1 ^ 1=0 1 ^ 0=1 0 ^ 1=1 0 ^ 0=0 (相同为 0 ;不同为 1)
#include<stdio.h>
#include<stdlib.h>
//异或运算 : 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<stdio.h>
#include<stdlib.h>
/*
左移 <<
右移 >>
*/
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://yundeesoft.com/14387.html