一篇带你了解C语言--位操作详情

目录
  • 二进制数、位和字节
    • 二进制整数
    • 有符号整数
    • 二进制浮点数介绍
  • 八进制和十六进制
  • C按位运算符
    • 按位逻辑运算符
      • 二进制反码或按位取反:~
      • 按位与:&
      • 按位或:|
      • 按位异或:^
    • 用法:掩码
    • 用法:打开位(设置位)
    • 用法:关闭位(清空位)
    • 用法:切换位
    • 用法:检查位的值
  • 移位运算符
    • 左移:<<
    • 右移:>>
  • 总结

在C语言中,是可以单独操控变量中的位的。因为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。最小值就是:0000 0000,其值为0。

所以1字节可以存储0~255范围内的数字总共256个值,在ASCII码中对应了256个状态。

unsigned char用1字节表示的范围是0~255,而signed char 用1字节表示范围是-128 ~ 127。

有符号整数

表示有符号数最简单的方式是用1位(高阶位)存储符号,剩下7位表示数字。
用这种符号量表示法,1000 0001表示 -1、0000 0001表示 1。其表示范围是 -127~127。这种方法的缺点是有两个0,+0和-0,有点浪费。

二进制补码方法避免了这个问题。以一字节为例:
二进制补码用1字节中的后7位表示0~127,高阶位设置为0.如果高阶位是1,表示的是负数。 假设一个值位组合为:1000 0000,无符号字节就表示的128,有符号字节表示-128。

要得到一个二进制补码的数的相反数,最简单的方法是反转每一位,然后加1。
1是0000 0001,-1就是 1111 1110 + 1,或 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表示。

3位二进制对应一位八进制

4位二进制对应一位十六进制

C按位运算符

C提供了按位逻辑运算符和移位运算符。

按位逻辑运算符

4个按位逻辑运算符都用于整形数据,包括char。

二进制反码或按位取反:~

一元运算符把1变为0,把0变为1。示例:

~(0001 1100)	//表达式
 (1110 0011)	// 结果值

需要注意的是该运算符不会改变之前变量的值,但确实创建了一个可以使用或赋值的新值。

按位与:&

二元运算符通过逐位比较两个运算对象生成一个新值。
对于每一个位,两个运算对象中相应的位都为1时,结果为1。示例:

(1001 1001) & (0011 1100)
//结果为
(0001 1000)

C有按位与和赋值结合的运算符:&=

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)的位组合。
假设定义符号常量MASK为2,即(0000 0010),那么语句

val &= MASK

就是把val中除了1号位以外的所有位都设置为01号位的值不变。这个过程叫做使用掩码,掩码中的0隐藏了val中的其他位。
图解:

用法:打开位(设置位)

有时需要打开一个值中的特定位,而其他位保持不变。

val |= MASK;

把val的1号位设置为1,其他位不变。

因为|运算符,任何位与0组合结果为本身,任何位与1组合,结果都为1。

用法:关闭位(清空位)

和打开类似,有时需要再不影响其他位的情况下关闭指定的位。
假设要关闭变量val中的1号位,MASK只有1号位为1。即:

val = val & ~MASK;

由于MASK除1号位以外全为0,那~MASK除1号位以外全为1。再使用&,任何位与1组合都为本身,所以这条语句保持除1号位以外其他各位不变。
示例:

val ^= MASK;
(0000 1111) ^ (1011 0110)
结果为
(10111001)

用法:切换位

是指打开已关闭的位,或关闭已打开的位。可以使用按位异或运算符(^)切换位。

if ((val & MASK) == MASK)
	printf("...");

val中与MASK为1的位相对应的位都被切换了,MASK为0的位相对应的位不变。

用法:检查位的值

若检查val的某一位是否为1,可设置一个掩码刚好这个位为1.

若检查第二位,即:

MASK为(0000 0010)

程序可以这样写:

if ((val & MASK) == MASK)
	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

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • python中opencv图像叠加、图像融合、按位操作的具体实现

    目录 1图像叠加 2图像融合 3按位操作 1图像叠加 可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res = img1 + img2.两个图像应该具有相同的深度和类型,或者第二个图像可以是标量值. NOTE: OpenCV添加是饱和操作,也就是有上限值,而Numpy添加是模运算. 添加两个图像时, OpenCV功能将提供更好的结果.所以总是更好地坚持OpenCV功能. 代码: import cv2 import numpy as np x = np.uint8

  • python selenium xpath定位操作

    xpath是一种在xm文档中定位的语言,详细简介,请自行参照百度百科,本文主要总结一下xpath的使用方法,个人看法,如有不足和错误,敬请指出. 注意:xpath的定位 同一级别的多个标签 索引从1开始 而不是0 1. 绝对定位: 此方法最为简单,具体格式为 xxx.find_element_by_xpath("绝对路径") 具体例子: xxx.find_element_by_xpath("/html/body/div[x]/form/input") x 代表第x个

  • vue+高德地图实现地图搜索及点击定位操作

    首先需要在index.html中引入高德地图的js链接,key需要换成你自己的key 最近有个需求是实现一个使用地图搜索定位的功能,在网上参考了下其他的文章,感觉不是很完善,自己整理了一下,可以实现点击定位,搜索列表定位等功能,可能有些地方是多余的,需要的自己看着改下 <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.14&key=你的key"></

  • opencv 实现特定颜色线条提取与定位操作

    本篇文章通过调用opencv里的函数简单的实现了对图像里特定颜色提取与定位,以此为基础,我们可以实现对特定颜色物体的前景分割与定位,或者特定颜色线条的提取与定位 主要步骤: 将RGB图像转化为HSV,H表示色调(度数表示0-180),S表示饱和度(取值0-255),V表示亮度(取值0-255),不同的颜色有着不同的取值范围,一般给出如下: 设定待提取颜色的HSV范围值,然后调用inRange函数实现对颜色空间的提取,该函数会将除目标颜色外的其余颜色为黑色背景,仅保留该颜色为前景 cv2.inRa

  • opencv中图像叠加/图像融合/按位操作的实现

    一.图像叠加:cv2.add res=cv2.add(img1, img2) 或者res=cv2.add(img1, 标量值) 参数说明: cv2.add将两个图片对应位置的像素的值相加,或者将每个像素的值加上一个标量值,大于255的像素值就设置成255. 有一点需要注意的是,如果是两张图片相加,那么一定要注意两者的尺寸和通道数必须是一样的:如果是标量值,这个值既可以是整数也可以是浮点数,加合适的标量值一般是为了提高亮度. import cv2 img1 = cv2.imread('1.jpg'

  • 一篇带你了解C语言--位操作详情

    目录 二进制数.位和字节 二进制整数 有符号整数 二进制浮点数介绍 八进制和十六进制 C按位运算符 按位逻辑运算符 二进制反码或按位取反:~ 按位与:& 按位或:| 按位异或:^ 用法:掩码 用法:打开位(设置位) 用法:关闭位(清空位) 用法:切换位 用法:检查位的值 移位运算符 左移:<< 右移:>> 总结 在C语言中,是可以单独操控变量中的位的.因为C在提供高级语言便利的同时,还能在为汇编语言所保留的级别上工作. 二进制数.位和字节 在我们日常生活中通常使用的十进制.

  • 手把手带你走进Go语言之常量解析

    目录 概述 常量 常量计算 iota 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 3 课) 常量 常量 (Constant) 是指程序在执行过程中不会改变的固定值. 常量可以是任何基本数据类型. 如整数常量, 浮点常量, 字符常量, 枚举常量. 常量一般都会被编译器视为常规变量, 只是常量的值不能再定义之后修改. 格式 1: const 变量名 = 值 格式 2: const 变量名 变量类型 例子: package main i

  • 手把手带你走进Go语言之语法基础解析

    目录 概述 Go 语法基础 关键字 标识符 数据类型 变量声明 多变量声明 值类型和引用类型 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 2 课) Go 语法基础 Go 程序可以由多个标记组成: 关键字 标识符 常量 字符串 符号 关键字 Go 语言有 25 个关键字: 关键字 作用 var & const 变量和常量的声明 package & import 导入 func 用于定义函数和方法 return 用于函数返回 d

  • 手把手带你走进Go语言之运算符解析

    目录 概述 Go 运算符 算术运算符 关系运算符 逻辑运算符 赋值运算符 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. Go 运算符 运算符 (operator) 可以帮助我们在程序中执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算术运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 取余 ++ 自增 – 自减 例子: package main import "f

  • 手把手带你走进Go语言之循环语句

    目录 概述 循环语句 方法一 方法二 方法三 break 关键字 continue 关键字 goto 关键字 [Golang]✔️走进 Go 语言✔️ 第六课 条件表达式 概述循环语句方法一方法二方法三break 关键字continue 关键字goto 关键字 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 6 课) 循环语句 使用好循环语句可以帮助我们提升代码的简洁性, 提高代码效率. 方法一 格式: for init; condi

  • 手把手带你走进Go语言之类型转换

    目录 概述 数据类型转换 浮点转整数 字符串转整数 整数转字符串 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. 数据类型转换 数据类型转换可以帮助我们将一种数据类型的变量转换为另外一个种类型的变量. 格式: type_name(expression) 浮点转整数 浮点转整数是从高精度向低精度转换, 小数点后面会被舍弃. 例子: package main import "fmt" func main() { // 定义float

  • 手把手带你走进Go语言之条件表达式

    目录 概述 if 语句 switch 语句 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 6 课) if 语句 通过一条或多条语句的执行结果来决定执行的代码块. 如图: 格式: if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } else if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } else if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } else { /* 上

  • 带你了解Python语言的神奇世界

    目录 一.特点 二.语法 三.表达式 四.变量 五.缩进 六.数据类型 七.Python值得学习嘛? Python是世界上最流行的解释型编程语言之一. 由 Guido van Rossum 设计,作为"ABC"编程语言的继承者",于 1991 年首次发布.它是一种高级通用语言,其设计理念是通过使用缩进来强调代码的可读性.Python 的语言结构旨在帮助程序员为小型和大型项目编写逻辑代码. Python 是一种面向对象.解释型.弱类型的脚本语言,它也是一种功能强大而完善的通用型

  • 带你理解C语言中的汉诺塔公式

    目录 汉诺塔公式 汉诺塔问题在数学层面的公式: C语言递归公式 两层汉诺塔 三层汉诺塔 总结 汉诺塔公式 汉诺塔问题在数学层面的公式: 不用说,你看到这个公式一定一脸懵逼,我现在来讲解这个公式的作用. 先来回想一下大象放冰箱要几步,三步吧,打开冰箱,放进去,关上门就行了,我们先不要去思考一些细碎的步骤,将一个复杂的问题先简单化,再慢慢去分析. 那汉诺塔问题也是同样的简单三步:(假设有n个盘子) 一.把最大的盘子留在A柱,然后将其他的盘子全放在B柱. 二.把最大的盘子放到C柱. 三.然后将B柱上的

  • 一文带你掌握Go语言运算符的使用

    目录 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 运算符优先级 运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 接下来让我们来详细看看各个运算符的介绍. 算术运算符 算术运算符,所有的数据类型要相同 下表列出了所有Go语言的算术运算符.假定 A 值为 10,B 值为 20. 运算符 描述 实例 + 相加 A + B 输出结果 30 - 相减 A - B 输出结果 -10 * 相

随机推荐