本文主要介绍一个简单的C语言位运算的例子,通过示例代码非常详细的介绍。对大家的学习或工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。
目录
二进制数、位和字节二进制整数有符号整数二进制浮点八进制和十六进制C位运算符按位逻辑运算符二进制否定或按位否定:~按位and:按位OR: |按位XOR:用法:掩码用法:开放位(Set位)用法:关闭位(Clear位)用法:Switch位用法因为C可以在为汇编语言保留的级别工作,同时提供高级语言的便利性。
二进制数、位和字节
我们日常生活中常用的十进制。
例如,数字1234可以写成:
1 *10e3 2 * 10e2 3 * 10e1 4 * 10e0
这种方法是以10的幂为基数的,所以叫做以10为基数的写法。
那么以2为基数表示的数就是二进制数。
例如,二进制数1111
1 * 2e3 1 * 2e2 1 * 2e1 1 * 2
转换成十进制是:
1* 8 1* 4 1*2 1=15
二进制整数
c语言以字节表示存储系统字符集所需的大小,通常1字节就是8位。
这8位可以从左到右编号为7~0。在一个字节中,编号为7的位称为高阶位,编号为0的位称为低阶位,每个位的编号对应2的对应指数。
该字节可以表示的最大数值是将所有位设置为1: 1111 1111,值为255。最小值为:0000000,其值为0。
因此,一个字节可以存储从0到255的256个数值,相当于ASCII码中的256个状态。
1字节无符号字符的范围是0~255,1字节有符号字符的范围是-128 ~ 127。
有符号整数
表示有符号数最简单的方法是用1位(高阶位)存储符号,剩下的7位表示数。
用这个符号表示,1000 0001代表-1,0000 0001代表1。其范围为-127~127。这种方法的缺点是有两个0和-0,有点浪费。
二进制补码法避免了这个问题。以一个字节为例:
二进制补码用1个字节的后7位表示0~127,高位设置为0。如果高位为1,则表示负数。假设一个值位组合为:1000 0000,无符号字节表示128,有符号字节表示-128。
获得二进制补数的倒数的最简单方法是反转每个位,然后加1。
是0000 0001,-1是1111 1101,或1111 1111。
二进制浮点数介绍
一个普通的十进制浮点数可以这样表示
0.234=2 /10 3/100 4/1000
从左到右,每个分母都是10的递增幂。
然后在二进制浮点数中,用2的幂作为分母,比如
.1011=1/2 0/4 1/8 1/16
八进制和十六进制
八进制以8为基数,数字用0~7表示。十六进制以16为基数,数字用0 ~15表示。但是没有一个单一的数字来表示10 ~ 15,所以用字母A ~F F表示。
3位二进制对应于1位八进制。
4位二进制对应1位十六进制。
C按位运算符
c提供按位逻辑运算符和移位运算符。
按位逻辑运算符
所有四个按位逻辑运算符都用于形成数据,包括char。
二进制反码或按位取反:~
一元运算符将1更改为0,将0更改为1。示例:
~(0001 1100)//表达式
(1110 0011)//结果值
请注意,该操作符不会更改前面变量的值,但会创建一个可以使用或赋值的新值。
按位与:
二元运算符通过逐位比较两个操作数来生成一个新值。
对于每个位,当两个操作数中对应的位为1时,结果为1。示例:
(1001 1001) (0011 1100)
//结果是
(0001 1000)
c #有一个运算符,它用and赋值进行按位组合:=
val=0247
等于
val=val 0247
按位或:|
二元运算符|,对于每一位,如果两个操作数中对应的位为1,则结果为1。
示例:
(1001 1001) | (0111 0010)
结果为
(1111 1011)
c也有这样的运算符:|=
按位异或:^
二元运算符,对于每一位,如果两个操作数中对应的位有一位为1,但不是两个都为1,则结果为1。
示例:
(1100 0001) ^ (0101 1011)
结果为
(1001 1010)
c也有这样的运算符:=
用法:掩码
掩码是指设置为开(1)或关(0)的一些位组合。
假设符号常量掩码定义为2,即(0000 0010),那么语句
val=掩码
也就是说,val中除位1以外的所有位都设置为与位01相同的值。这个过程被称为使用掩模。掩码中的0隐藏val中的其他位。
插图:
用法:打开位(设置位)
有时需要打开一个值中的特定位,而其他位保持不变。
val |=MASK
将val的位1设为1,其他位保持不变。
由于|运算符的存在,任何位与0组合都会产生自身,任何位与1组合都会产生1。
用法:关闭位(清空位)
类似于open,有时需要在不影响其他位的情况下关闭指定位。
假设要关闭变量val中的位1,只有MASK的位1为1。即:
val=val ~ MASK
由于MASK除了位1都是0,那么~MASK除了位1都是1。同样,位和1的任何组合都是它本身,所以这个语句保持除位1以外的所有位不变。
示例:
瓦尔^=面具;
(0000 1111) ^ (1011 0110)
结果为
(10111001)
用法:切换位
它是指打开关闭的位或关闭打开的位。您可以使用按位XOR运算符()来交换位。
if((值掩码)==掩码)
printf(' . '));
在val中,对应于掩码为1的位的位被交换,对应于掩码为0的位不变。
用法:检查位的值
如果检查val的某个位是否为1,可以设置一个掩码,这个位为1。
如果第二位被勾选,即:
面具(0000 0010)
程序可以这样写:
if((值掩码)==掩码)
printf(' . '));
为了避免信息越过边界泄漏,掩码应该至少与它覆盖的值一样宽。
移位运算符
左移:
左移运算符将左操作数的每一位的值向左移动右操作数指定的位数。移出左端位的左操作数的值丢失,空位置用0填充。
示例:
(1000 0110) 2
结果为
(0001 1000)
您可以使用左移赋值运算符(=)来更改变量的值。
int val=1;//0000 0001
val=2;
结果为
0000 0100
右移:
右移位运算符将左操作数的每一位的值向右移位右操作数指定的位数。
对于无符号类型,用0填充空位;对于有符号类型,结果取决于机器。
示例:=
int val=16//0001 0000
val=3;
结果是:
0000 0010
总结
本文到此为止。希望能帮到你,也希望你能多关注我们的更多内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。