首页 > 其他分享 > 逍遥自在学C语言 | 位运算符&的高级用法

逍遥自在学C语言 | 位运算符&的高级用法

时间:2023-04-10 18:02:02浏览次数:36  
标签:二进制 逍遥自在 C语言 运算符 int 次方 printf 掩码

前言

在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法。

一、人物简介

  • 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。

  • 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。

二、位掩码

  • 位掩码是一种用于按位操作的技术

  • 它通过使用一个二进制数(掩码)来屏蔽或保留目标数中的一些特定位

  • 例如,如果要将一个无符号整数的最高位清零,可以使用以下代码:

#include <stdio.h>

int main()
{  
	unsigned int x = 0xABCD1234; //0b10101011110011010001001000110100
	x &= ~(1U << 31);
 
    printf("x = %u\n",x);
	return 0;
}
  • 1U << 31 表示将一个无符号整数的最高位设置为 1
  • ~(1U << 31)取反得到掩码,再和原数进行按位与运算,就可以将最高位清零

三、判断奇偶性

二进制末尾位
奇数 1
偶数 0
  • 一个数的二进制表示中,如果最后一位为 1,则它是奇数,否则它是偶数
  • 因此,可以使用 & 运算符来判断一个数的奇偶性,例如:
#include <stdio.h>
int main()
{
    int x = 7;
    if (x & 1) 
    {
        printf("%d 是奇数\n", x);
    } 
    else 
    {
        printf("%d 是偶数\n", x);
    }
    return 0;
}
  • x & 1 将返回 x 的最后一位与 1 的按位与
  • 如果结果为 1,说明 x 是奇数,否则 x 是偶数。

四、判断是否为 2 的幂次方

  • 如果一个数是 2 的幂次方,那么它的二进制表示中,只有最高位为 1,其他位都为 0
  • 把这个数减去1,那么它的二进制表示中,最高位为 0,其他位都为1
  • x & (x - 1)的结果一定为 0
  • 例如,判断16 是否是 2 的幂次方:
#include <stdio.h>
int main()
{
    unsigned int x = 16;
    if (!(x & (x - 1))) 
    {
        printf("%u 是 2 的幂次方\n", x);
    } 
    else 
    {
        printf("%u 不是 2 的幂次方\n", x);
    }
    return 0;
}

小结

通过这篇文章,我们学会了用位运算符&来做位掩码操作、判断奇偶性、判断一个数是否为2的幂次方。

在下一篇文章中,我们将介绍位运算符|的几个高级用法。

标签:二进制,逍遥自在,C语言,运算符,int,次方,printf,掩码
From: https://www.cnblogs.com/Wayne123/p/17303768.html

相关文章

  • 01 | C语言异常处理(jmp_buf、setjmp、longjmp)
    首先说明,C语言中的异常处理主要还是错误码的思路.其次,C语言中是有返回两次的函数的,比如说fork()函数在C语言中是没有trycatch块的,但并不代表没有异常处理。接下来我们简单明确三个概念,最后来一个简单的小例子。1.三个概念使用一个jmp_buf的类型变量来充当异常......
  • C语言学习第五天
    打字练习软件typespeed  1、安装:sudoapt-getinstalltypespeed  2、打开typespeed保证窗口至少80*24一、Windows下获取方向键:  1、导入#include<conio.h>  2、通过getch()的返回值获取键盘上的键值    上:72 下:80 左:75 右:77二、Lin......
  • C语言GCC编译错误(收集)
    错误一: 实参类型不兼容这是Linux下编写的UDP方式通信的服务器端代码:intret_rec=recvfrom(soc_fd,//上面定义的UDP套接字 msg, //接收数据缓存区 128, //接收数据缓冲区,大小 0, // 和发送端一样的标记 from_addr,//......
  • VS2019使用C语言进行websocket编程
    一直在写C#代码好多年不写C语言代码了,记录一下之前某个项目里用C写的一个websocket服务,用C的优势是写的东西体积小性能高,但是写业务的话还得用C#、Java之类的语言,不然会折腾死人。。。 用VisualStudio新建一个C++(因为不能直接建C语言项目)项目,我演示就创建一个控制台项目。项......
  • c++Primer 14 重载运算符与类型转换
    除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参。      泛型算法中调用的几元谓词是看函数对象的调用运算符的参数个数。而不是构造函数的参数个数。    转换构造函数只能有一个参数,如果他有多个参数,就无法判断是将哪个参数转......
  • 自用纯C语言实现任务调度(可用于STM32、C51等单片机)
    前言  这个任务调度模块的实现是形成于毕设项目中的,用在STM32中,断断续续跨度2个月实现了一些基本功能,可能后面再做其他项目时会一点点完善起来,也会多学习相关知识来强化模块的实用性和高效性,毕竟用自己自主实现出来的功能还是蛮舒心的。任务调度模式结构  整体上的结构属于......
  • C语言程序环境
    前言早期的程序员,使用的是二进制语言编写代码,之后发展出汇编语言,B语言,C语言等等,其中,二进制语言是机器可以识别的语言,但对于程序员来说理解可能较为困难,发展到C语言时,我们所写的代码已经经过不断优化,使得程序员能清晰的明白代码的含义,但最终,我们要想机器识别出我们所写的代码,还需要......
  • C语言的回调函数原来这么简单
    手机端阅读:C语言的回调函数原来这么简单 了解开发语言的朋友应该都会对回调函数有所了解,在很多的程序开发语言中都能看到回调的身影。很多场景下,当某个条件成立以后我们希望代码执行某些指定的部分,这个时候可以考虑使用回调函数的方式,这样做思路更加的清晰,也能使代码结构的逻辑更加......
  • 算法学习之冒泡排序【C语言】
    冒泡排序排序规则冒泡排序的规则是相邻的两个数字依次比较,如果前面的数字比后面的数字大,则交换它们的位置,否则保持不变,直到遍历完所有的数字。这个过程会不断地进行,直到所有的数字都按照从小到大的顺序排列好。双层循环在冒泡排序的算法中,需要使用两层循环来实现排序功能。for(int......
  • C语言本地变量的规则
    以以下一段代码为例:1#include<stdio.h>2//以下代码是否能交换两个变量的值?3voidswap(inta,intb);45intmain()6{7inta=5;8intb=6;910swap(a,b);1112printf("%d,%d",a,b);1314return0;15}16......