Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言位操作

C语言位操作

作者头像
WuShF
发布于 2023-03-11 02:00:04
发布于 2023-03-11 02:00:04
1.8K00
代码可运行
举报
文章被收录于专栏:笔记分享笔记分享
运行总次数:0
代码可运行

深入到字节的内部,讨论如何直接操作字节内部的二进制位

十进制转二进制

短除法&位权法

先读高位、后读低位从下往上逆序读右侧的余数101010。这就是十进制数42所对应的二进制。

将二进制转换为十进制,可以把二进制中的各位乘以其所在位的位权,再将所有乘法的积累加起来,即可得到转换后的十进制结果。 例如: 二进制101010,高位在左,低位在右

十进制转二进制函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
void printBinary(unsigned char dec) {
	// 若dec为0,输出0并返回
	if (dec == 0)
	{
		printf("0\n"); return;
	}
	// 若dec非0,短除计算余数,逆序输出
	char bits[8];
	int count = 0;
	int quotient;
	int remainder;
	while (dec > 0)
	{
		remainder = dec % 2;
		quotient = dec / 2;
		dec = quotient;
		bits[count] = remainder;
		count++;
	}
	for (int i = count - 1; i >= 0; i--)
		printf("%d", bits[i]);
	putchar('\n');
}
int main() {
	printBinary(42);//以42为例
}

正确输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
101010

对于unsigned char类型的变量dec来说,它拥有8个二进制位。而十进制数42,只占6个二进制位,还有两个二进制位为0。若需要把8个二进制位全部输出,可以将bits数组初始化为0。计算完余数后,从数组的最后一个元素开始,逆序输出直到数组第一个元素。此时,无需对dec为0做特殊处理了。由于数组bits初始化为0,dec为0时,不进入while循环,直接输出8个0。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
void printBinary(unsigned char dec) {
	char bits[8] = {0};
	int count = 0;
	int quotient;
	int remainder;
	while (dec > 0)
	{
		remainder = dec % 2;
		quotient = dec / 2;
		dec = quotient;
		bits[count] = remainder;
		count++;
	}
	for (int i = 8 - 1; i >= 0; i--)
		printf("%d", bits[i]);
	putchar('\n');
}
int main() {
	printBinary(42);
}

补齐0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
00101010

逻辑运算符

逻辑运算符会把运算对象的数值,看做真或假进行逻辑运算。若运算对象的数值为非0值,则看做真。若数值为0值,则看做假。 下面分别复习一下这3种逻辑运算符。

逻辑与&&

逻辑与&&运算符会对左右两边,两个运算对象进行运算。

  1. 若两个运算对象同时为真时,运算结果为真,用数值1表示。
  2. 否则,运算结果为假,用数值0表示。

12345 && 67890 左右有两个运算对象,分别为1234567890。左边的运算对象12345为非0值,看做真。右边运算对象67890为非0值,看做真。两个运算对象同时为真,运算结果为真,即1。 若将其中一边变为0,表达式如下: 12345 && 0 左边的运算对象12345为非0值,看做真。右边运算对象0为0值,看做假。两个运算对象不同时为真,运算结果为假,即0。

逻辑或||

逻辑或||运算符会对左右两边,两个运算对象进行运算。

  1. 若两个运算对象同时为假时,运算结果为假,用数值0表示。
  2. 否则,运算结果为真,用数值1表示。

12345 || 0 左边的运算对象12345为非0值,看做真。右边运算对象0为0值,看做假。两个运算对象不同时为假,运算结果为真,即1。 0 && 0 左边的运算对象0为0值,看做假。右边运算对象0为0值,看做假。两个运算对象同时为假,运算结果为假,即0。

逻辑非!

逻辑与!运算符会对右边一个运算对象进行运算:

  1. 若运算对象为真,运算结果为假。
  2. 若运算对象为假,运算结果为真。

!12345 右边运算对象12345为非0值,看做真。运算结果为假,即0。 !0 右边运算对象0为0值,看做假。运算结果为真,即1。

位运算符

在上面的逻辑运算中,会把运算对象的数值根据非0值或0值,看做真或假,再进行逻辑运算。 还有另外一类运算符,它将深入运算对象的内部,把运算对象内部的二进制位,根据非0值或0值,看做真或假,再进行逻辑运算。

位逻辑运算符:

  1. 位逻辑与&
  2. 位逻辑或|
  3. 位逻辑异或^
  4. 位逻辑非~

将十进制170作为函数printBinary的参数,它将打印出十进制170的二进制10101010。 将十进制102作为函数printBinary的参数,它将打印出十进制102 的二进制01100110。 接下来,我们让这两个数值分别做各种位逻辑运算,看看它们都有什么现象。

位逻辑与&

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
printf("%hhu\n", 170 & 102);
printBinary(170 & 102);

位逻辑与&它将深入字节内部,对二进制位进行逻辑与运算。

  1. 若两个位同时为真,运算结果为真,用数值1表示。
  2. 否则,运算结果为假,用数值0表示。

前四位为例

位逻辑或|

  1. 若两个位同时为假时,运算结果为假,用数值0表示。
  2. 否则,运算结果为真,用数值1表示。

位逻辑异或^

  1. 若两个位不同时,运算结果为真,用数值1表示。
  2. 否则,运算结果为假,用数值0表示。

位逻辑非~

位逻辑非~它将深入字节内部,对二进制位进行逻辑非运算。

  1. 若二进制位为真时,运算结果为假,用数值0表示。
  2. 二进制位为假时,运算结果为真,用数值1表示。

换句话说,位逻辑非运算会翻转运算对象的所有二进制位。二进制位1变为0,0变为1。

左移右移

左移运算符<<

左移运算符将数据对象内部的二进制全部向左移动指定位,空出来的位置用0填充。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
void printBinary(unsigned char dec) {
	char bits[8] = {0};
	int count = 0;
	int quotient;
	int remainder;
	while (dec > 0)
	{
		remainder = dec % 2;
		quotient = dec / 2;
		dec = quotient;
		bits[count] = remainder;
		count++;
	}
	for (int i = 8 - 1; i >= 0; i--)
		printf("%d", bits[i]);
	putchar('\n');
}
int main() {
	printBinary(231);
	printBinary(231 << 1);
	printBinary(231 << 2);
	printBinary(231 << 3);
}

输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
11100111
11001110
10011100
00111000

右移运算符

右移运算符将数据对象内部的二进制全部向右移动指定位,对于无符号类型,空出来的位置用0填充。 对于有符号类型,空出来的位置用0或1填充取决于编译器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
void printBinary(unsigned char dec) {
	char bits[8] = {0};
	int count = 0;
	int quotient;
	int remainder;
	while (dec > 0)
	{
		remainder = dec % 2;
		quotient = dec / 2;
		dec = quotient;
		bits[count] = remainder;
		count++;
	}
	for (int i = 8 - 1; i >= 0; i--)
		printf("%d", bits[i]);
	putchar('\n');
}
int main() {
	printBinary(231);
	printBinary(231 >> 1);
	printBinary(231 >> 2);
	printBinary(231 >> 3);
}

输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
11100111
01110011
00111001
00011100
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【c语言】运算符汇总(万字解析)
为了促进大家深入理解C语言并提升学习效率,本博客作者将对C语言中常用运算符的功能及其使用方法进行全面梳理,同时整合归纳这些运算符的优先级、结合性以及表达式求值规则。
ephemerals__
2024/10/30
1.1K0
【c语言】运算符汇总(万字解析)
操作符详解(这么详细的操作符介绍你确定不看一看?)【C语言】【附试题详解】
操作符的分类:算数操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、(下标引用、函数调用和结构成员)。
see.
2024/06/04
1220
操作符详解(这么详细的操作符介绍你确定不看一看?)【C语言】【附试题详解】
C语言(7)----操作符
C语言中的操作符是用来进行各种数学运算、逻辑运算、位运算、赋值等操作的符号,那么看着是不是就和我们日常生活中的这些语法结构很像呢?
Skrrapper
2024/06/18
1460
C语言(7)----操作符
C 语言基础 - 第一节
C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。例如,下面的 C 语句包括五个令牌:
赤月未咲
2023/03/17
5400
小白必看系列之c语言中常见操作符示例和用法总结
C语言是一种广泛使用的编程语言,拥有丰富的操作符(operator)来进行不同类型的操作。下面我将详细介绍常用的C语言操作符及其功能:
全栈若城
2024/02/29
2680
小白必看系列之c语言中常见操作符示例和用法总结
C语言复习概要(四)
算术操作符用于处理整数和浮点数的基本运算,它们包括加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。
Undoom
2024/10/08
1290
回溯2:深入探讨C语言中的操作符 —— 从基础到进阶
在编写C语言程序的过程中,操作符是我们不可避免要使用的工具之一。无论是在简单的计算还是复杂的逻辑处理中,操作符的运用决定了程序的执行效果和效率。在这篇文章中,我们将结合实际的C语言代码,详细探讨C语言中各类操作符的使用、背后的原理以及如何利用它们提升代码质量和效率。通过清晰的讲解和丰富的代码示例,帮助读者更好地理解和掌握C语言操作符的用法。
用户11289931
2024/11/24
1520
【C语言总集篇】操作符篇——从不会到会的过程
大家好,很高兴又和大家见面了!现在我们以及结束了数组与函数知识板块的学习,今天我们将进入下一个板块——操作符板块的学习,下面开始介绍我们今天的内容吧。
蒙奇D索隆
2023/12/06
4250
【C语言总集篇】操作符篇——从不会到会的过程
【Java 基础篇】Java 运算符
在Java编程中,运算符是用于执行各种操作的符号。通过使用运算符,我们可以进行算术运算、逻辑运算、赋值操作等。本篇博客将围绕Java运算符展开讨论,并介绍不同类型的运算符以及它们的用法和注意事项。我们还将提供代码示例来说明这些概念的具体应用。
繁依Fanyi
2023/10/12
2920
C语言操作符
除了%操作符,其余操作符既适用于浮点类型,又适用于整数类型。当/操作符的两个操作数都是整数时执行整除运算,其他情况执行浮点数除法。 % 为取模操作符,其两个操作数必须为整数,而返回的值是整除之后的余数。
海盗船长
2020/08/27
1.1K0
操作符(笔记)
走在努力路上的自己
2024/01/26
1390
操作符(笔记)
C语言位操作(一)
终于恢复了上班状态,太开心了。前几天自己也离开上一家公司,又重新找了一个新的岗位,这里自己还是运气比较好,找到了Linux岗位;不管怎么说,还是要好好学习,继续努力,只有努力了才有机会,不努力就算有机会,也可能随风而飘了。还有上次的C语言面试题目还有两篇文章没写完,刚好周末有时间来整理,明天给大家分享出来。每天进步一点点,日积月累你也是专家。
用户6280468
2022/03/21
1.2K0
数据库之运算符详解
注意:在除法运算和模运算中,如果除数为0,将是非法除法,返回结果为NULL。 例:
小手冰凉
2020/04/24
1.8K0
Java &、&&、|、||、^、<<、>>、~、>>>等运算符
无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0。
萬物並作吾以觀復
2018/09/13
173.7K4
Java &、&&、|、||、^、<<、>>、~、>>>等运算符
c语言基础知识菜鸟_c语言入门基础100题
C中每个变量都有其特定类型,类决定了变量存储的大小和布局(指定范围内的值都可以存储到内存中,运算符作用变量上)
全栈程序员站长
2022/09/21
9910
【C语言】位与移位操作符详解
8进制的数字每⼀位是 0~7 的,0~7的数字,各⾃写成2进制,最多有 3个2进制位 就⾜够了,比如7的二进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算一个8进制位,剩余不够3个2进制位的直接换算。
大耳朵土土垚
2024/03/13
2890
【C语言】位与移位操作符详解
抽丝剥茧C语言(中阶)操作符+练习
这一篇会让你更加熟练合理的利用操作符,有一些代码是很坑爹的: int i = 1; int ret = (++i) + (++i) + (++i); 是不是很熟悉? 其实这个是个有问题的代码,至于是为什么? 我们往下看。
有礼貌的灰绅士
2023/03/28
6010
抽丝剥茧C语言(中阶)操作符+练习
C:操作符介绍-学习笔记
本篇文章将为您带来C语言操作符的全面解析,您可以将其视为操作符的百科全书。无论您对哪个操作符的使用有所遗忘,都可以在这里找到所需的知识,让您的编程之路更加顺畅。
LonlyMay
2024/10/21
3400
C:操作符介绍-学习笔记
【C语言】异或(^)操作符
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
修修修也
2024/04/01
1.6K0
【C语言】异或(^)操作符
【必读】C语言基础知识大全
C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。 例1:计算两个整数之和的c程序: #include main() { int a,b,sum; /*定义变量a,b,sum为整型变量*/ a=20; /*把整数20赋值给整型变量a*/ b=15; /*把整数15赋值给整型变量b*/ sum=a+b; /*把两个数之和赋值给整型变量sum*/ printf(“a=%d,b=%d,su
老九君
2018/03/06
6.4K0
【必读】C语言基础知识大全
相关推荐
【c语言】运算符汇总(万字解析)
更多 >
LV.3
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验