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.8K40
代码可运行
举报
文章被收录于专栏:笔记分享笔记分享
运行总次数: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 删除。

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

评论
登录后参与评论
4 条评论
热度
最新
杨哥,太适合小白了
杨哥,太适合小白了
112举报
学习起来吧
学习起来吧
回复回复1举报
写的不错,对于学习与练手非常好的文章。
写的不错,对于学习与练手非常好的文章。
111举报
操练起来
操练起来
回复回复1举报
推荐阅读
编辑精选文章
换一批
从零玩转系列之腾讯云微信扫码授权系统
在我读书的时候就想玩这个功能很久了那个时候受限于这个功能需要企业或个体户去花费三百块认证服务号等方式, 反正企业或者个体户就难倒一大片了吧? 还要钱, 对于很多程序员是舍不得的, 那么不想认证又不想花费怎么办?
杨不易呀
2024/11/29
1.6K16
从零玩转系列之腾讯云微信扫码授权系统
小程序引导用户点击登录授权弹出层,以组件的形式调用
简介 小程序用户登录,功能页的使用,是需要用户授权登录,但是登陆的代码不可能每个页面都写一次,解决的办法有很多种,下面介绍一种方式,以组件调用的方式简单实现用户授权登录
子润先生
2021/06/25
1.5K0
黑马程序员uni-app 小兔鲜儿 项目及bug记录(上)
https://blog.csdn.net/qq_42880714/article/details/126509087
Qiuner
2024/07/20
5690
黑马程序员uni-app 小兔鲜儿 项目及bug记录(上)
用小程序来实现扫码登录
在 web 开发中,少不了用户系统,开发者需要开发注册登录这些重复的功能,而对于用户来说,要要注册才可以使用,往往会不愿意,因为我们有太多的账号和密码了,而现在,微信拥有 12 亿的月活用户,使用微信实现扫码登录,会大大减少需要用户注册而造成的流失率,而实现微信扫码登录有一定门槛,首先需要是企业用户才可以在微信开发平台注册账号,紧接着需要认证缴费 300 元才可以,简直就是黑店,而现在我们可以使用小程序来实现,今天就来讲讲小程序扫码登录的实现方式。
狂奔滴小马
2022/09/21
2K0
用小程序来实现扫码登录
微信扫描小程序码登录 PC 网站 Demo
本文主要介绍如何基于小程序页面授权,使用微信扫描PC端小程序码实现获取用户信息进行系统登录。
薛定喵君
2021/01/27
3.4K0
二维码登录实现(EggJS, 小程序)
扫码后, 判断是否存在二维码, 若存在, 则判断是否有效, 有效则判断当前微信用户是否绑定了后管账号, 绑定则进行登录操作, 反之返回未绑定状态码
治电小白菜
2020/08/25
1.2K0
二维码登录实现(EggJS, 小程序)
【uniapp】视频分享预览小程序
六一收到个不同以往的需求,我的指导老师最近有点忙,让我们帮忙做一个可以通过二维码预览视频的小程序
德宏大魔王
2023/08/08
3750
【uniapp】视频分享预览小程序
我的 Serverless 实战—SCF构建小型服务端并结合uni-app
【本文正在参与“100%有奖|我的Serverless 实战”征稿活动】,活动地址:https://marketing.csdn.net/p/15940c87f66c68188cfe5228cf4a0c3f
代码哈士奇
2021/10/25
9830
我的 Serverless 实战—SCF构建小型服务端并结合uni-app
【愚公系列】2022年11月 uniapp专题-优购电商-个人中心页面
个人中心的信息复杂度与产品本身有关。体系越庞大的产品,对应个人中心页面需要承载的内容越多,结构势必复杂。
愚公搬代码
2022/12/05
6050
【愚公系列】2022年11月 uniapp专题-优购电商-个人中心页面
从零玩转系列之微信支付实战Uni-App微信授权登录和装修下单页面和搭建下单接口以及发起下单请求
本篇将为您介绍微信支付在小程序 Uniapp 端的全新篇章。微信支付作为移动支付领域的先驱之一,不断演进与创新,为用户和开发者提供更便捷、安全的支付体验。在本文中,我们将深入探讨微信支付在小程序 Uniapp 端的应用与优势。
杨不易呀
2023/09/27
3K13
从零玩转系列之微信支付实战Uni-App微信授权登录和装修下单页面和搭建下单接口以及发起下单请求
uni-app(优医咨询)项目实战 - 第3天
上述配置内容是关于 Prettier 的常用的配置项,以后实际开发过程中可以根据需要逐步完善。
程序员朱永胜
2024/04/20
4560
小程序扫码成功后带着参数跳转到指定页面
要扫的二维码,通过草料二维码生成的,这个网站挺好的,用起来比较简单方便,可以直接输入文字生成二维码,也可以放入链接生成二维码。
王小婷
2018/12/26
5K0
测试平台分支-小程序端-3-小程序登录(上)
一年没更新了,今天本地运行了下都快忘了写啥了。ε=(´ο`*)))唉现在的行情还是多学习吧。
怪盗LYL
2023/09/15
4110
测试平台分支-小程序端-3-小程序登录(上)
【uniapp】文件授权验真系统(含代码)
之前的同学联系我说,他们公司想做一个能将客户的证明材料通过二维码扫描显示验真结果的一个系统(经他们公司核对无误后的验真),这个功能不难开发,我们先梳理一下思路:
德宏大魔王
2023/08/08
2500
【uniapp】文件授权验真系统(含代码)
微信小程序实现扫码登录网站
最近使用腾讯云时,用的都是微信扫码登入,发现会跳转到腾讯云助手小程序进行确认登入。感觉挺好用的,就想做一个扫码登入。
王秀龙
2021/09/09
7.4K3
uni-app(优医咨询)项目实战 - 第4天
此处的权限验证是指服务端接口验证码 token 是否存在或有效,这就需要我们在调用接口时将 token 以自定义头信息的方式发送给服务端接口,如果 token 不存在或者 token 过期了,则接口会返回状态码的值为 401。
程序员朱永胜
2024/04/25
3640
不会小程序设计?10分钟AI工具助你从需求到uniapp开发
之前2025年的年初开年之时,我立下了一个Flag,那就是写一个记账类型的小程序。
半月无霜
2025/03/29
1550
使用uni-app开发微信小程序之登录模块
从微信小程序官方发布的公告中我们可获知:小程序体验版、开发版调用 wx.getUserInfo 接口,将无法弹出授权询问框,默认调用失败,需使用 <button open-type="getUserInfo"></button> 引导用户主动进行授权操作:
wfaceboss
2019/04/08
5.8K1
使用uni-app开发微信小程序之登录模块
小程序生成普通二维码_注册一个小程序
参考了https://blog.csdn.net/lemontealin/article/details/104437584 这篇文章并做了修改,要想实现二维码的生成的话是需要引用相应插件的, 这个插件的作者是echo,echo写了整个Thor UI组件,我个人很佩服他,喜欢他的可以去Thor UI网站看看,学习一下。 1)首先下载你需要下载weapp-qrcode.js(百度网盘下载链接:链接:https://pan.baidu.com/s/1VXhq3ZjxmDcH1tFujKg75Q 提取码:vj2y) (2)在你的uni-app项目中需要的地方引入下载的weapp-qrcode.js文件。在标签中引入,如下
全栈程序员站长
2022/11/15
7750
小程序生成普通二维码_注册一个小程序
微信小程序+PHP 实现授权登录
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155584.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
2.5K0
推荐阅读
相关推荐
从零玩转系列之腾讯云微信扫码授权系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验