C语言中很难理解的部分

如题所述

首先应该明白,位运算是指对二进制位进行的运算(言下之意是要对其他进制数与二进制数的转换熟练掌握才能更好的理解),运算对象只能是整型数或字符型数据而非其他。位运算结果为整型数据。下面是各位运算符的介绍:
1、&,是指参与运算的两数对应位相与,也就是对应位都是1,则该位结果为1,否则为0.如,3&5运算过程如下:3&5的值为1
0000000000000011
(十进制无符号数3)
(&)0000000000000101
(十进制无符号数5)
0000000000000001
2、|,是指参与运算的两数对应位相或,也就是对应位都是0,则该位结果为0,否则为1.如,3|5运算过程如下:3|5的值为7
0000000000000011
(十进制无符号数3)
(|)0000000000000101
(十进制无符号数5)
0000000000000111
3、^,
是指参与运算的两数对应位相异或,也就是对应位都相同,则该位结果为0,否则为1.如,3^5运算过程如下:3^5的值为6
0000000000000011
(十进制无符号数3)
(^)0000000000000101
(十进制无符号数5)
0000000000000110
4、~,是指将一个二进制数按位取反,也就是1变0,0变1。如,~a运算过程如下:~a的值为(假定有int
a=3)-4
(~)
0000000000000011
(十进制无符号数3)
1111111111111100
5、<<
、是指将该符号左边的二进制位全部左移该符号右边指定的若干位,左边移出的位丢失,右边空出的位用0补充。左移没溢出时,移n位相当于该数乘以2的n次方。如,4<<2,运算过程如下
(<<)0000000000000100
0000000000010000
6、>>、是指将该符号左边的二进制位全部右移该符号右边指定的若干位,左边空出的位补原最左边的那位的值(有的编译系统补0)。右移n位相当于将该数除以2的n次方。如,4<<2运算过程如下:
(>>)0000000000000100
0000000000000001
(注:对于有符号数,在右移时,符号位将随同移动。符号位为1,最高位是补0或是补1
取决于编译系统的规定。Turbo
C和很多系统规定为补1。)
我也是个初学者,说的不对的地方希望多多指教。
补充:
1、按位与运算常用于取一个数中的某些指定位。如取整型数a的低8位,只要用a和0377按位与就可以了。
2、按位或运算常用于将一个数的某些位置1。如将整型数a的低8位全置1,只要用a和0377按位或即可。
3、按位异或运算常将一个数的某些位翻转,即0变1,1变0.如:将整型数a的低8位翻转,只要用a和0377按位异或即可。另外也可以不用中间变量实现两个变量值的交换。设有int
a=3,b=4;交换a和b的值可以有:a=a^b;b=b^a;a=a^b;实现。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-08-04
首先楼主要知道二进制:
位运算分:
与&(1&1=1
1&0=0
0&0=0)
或|(1|0=1
1|1=1
0|0=0)
取反~(~1=0
~0=1)
异或^(1^0=1
1^1=0
0^0=0)
相同为0,不同为1
移位<<
>>()
&
00010001
&01001001
00000001
|
00010001
|01001001
01011001
~
~01001001
10110110
^
00010001
^01001001
01011000
<<
00010001
<<2
01000100
(右边加2个0,左边去掉两位)
>>
00010001
>>2
00000100
(左边加2个0,右边去掉两位)
第2个回答  2019-12-26
你把逻辑运算当作无进位的运算理解
比如算术运算
二进制:
1+1=10
逻辑运算
"或"
"or"
"+"
1+1
=
1
比如这个你可以理解为不进位的加
相似回答