惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
博客园 - 【当耐特】
WordPress大学
WordPress大学
爱范儿
爱范儿
美团技术团队
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
量子位
Hugging Face - Blog
Hugging Face - Blog
B
Blog RSS Feed
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
博客园 - 叶小钗
GbyAI
GbyAI
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
F
Full Disclosure
G
Google Developers Blog
D
Docker
T
Tailwind CSS Blog
C
Check Point Blog
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
B
Blog
博客园 - 三生石上(FineUI控件)
博客园 - Franky
H
Help Net Security
MyScale Blog
MyScale Blog
U
Unit 42
D
DataBreaches.Net
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
L
LangChain Blog
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog

博客园 - kingkoo

ReaHat7.6/7.7 最小化安装更新yum源 java程序员经常使用的Intellij Idea插件 NDK版本 下载地址 在Intellij IDEA下用X-debug调试PHP DMSFrame 之查询表达式用法(一) Wise 打包细节 将Centos的yum源更换为国内的阿里云(163)源 Centos下安装 .net Core运行程序 使用 Docker 一步搞定 ZooKeeper 集群的搭建 docker 安装与学习 maven中scope标签以及exclusions 记录 Centos MySQL数据库迁移详细步骤 Maven 本地仓库明明有jar包,pom文件还是报错解决办法 编程中位运算用法总结 C++ CompletionPort(完成端口)示例 消息中间件Notify和MetaQ-阿里中间件 DMSFrame 之SqlCacheDependency(二) DMSFrame 之SqlCacheDependency(一) DMSFrame 之简单用法(二)
位与,位或,位异或运算符的理解
kingkoo · 2016-12-05 · via 博客园 - kingkoo

1.位与符号是&
真值表达式为: 1&1=1,1&0=0,0&1=0,0&0=0
记忆方式:&& 我们很容易理解..其实就是真真才为真,相当于&&必须两个条件为真时才为真,这样是不是很好理解.
用途:一般用于位清零操作,和取位值操作
例如: int x = 0xD2;
二进制数为:
0000 0000 0000 0000 0000 0000 1101 0010(32位编译,右边开始数,0位开始)
我们要把从bit4-bit7清0操作就可以直接用

0xD2 &= ~(0xf << 4) //最后的结果是0x2

可以这样理解:0xf可以这样理解,     (7-4+1)个1      也就是4个1(1111),16进制表示0xf; 左移4位就是从哪位开始清,就左移几位的,得到结果就是 1111 0000 再求反得到结果就是 0000 1111,然后进行位与操作就刚好把 前半段 1101  清除掉了..呵呵~~~

如果只把bit4清0操作怎么办呢..其实就是

0xD2 & ~(0x1 << 4)  //结果为0XC2

也就是:1101 0010  =>  1100 0010 了(第4位,再次强调下是右边从0开始数哦)

理解了么~~~再看看怎么取值,假设我们要取1101 0010红色段位的值,也就是第2位到第4位,这里只是举例,一般都是取段位的

(0xD2 & (0x7 << 2)) >> 2  //除了第3-第5位全部清0,注意0x7是3个1(4-2+1)个人 再左移2位 这里没有取反,再右移2位,这里是从第二位开始.

结果刚好是 0x4 二进制为:0100,是不是刚好是红色的数字呢,呵呵,注意一般取值至少有个1,要不然取出来就是0了

右移两位后

刚好是我们要取值的那个位...

 再如:1101 0010 第4-7位加12是怎么做到的呢(一般开发板编程会这样用的)

如下思路:

//注意不是设置值,如果是设置值,一般我们直接清0,然后直接进行与或就好.
    //1.取出第4位到第7位的值
    int tmp = (0xD2 & (0xf << 4)) >> 4;
    //2.直接这个值加上12
    tmp += 12;
    //3.对第4到第7位清0操作
    int y = 0xD2 & ~(0xf << 4);
    //4.再用原来的值对 tmp  进行与或(注意这个地方要左移4位还原到我们取值的位置)
    y = y | (tmp << 4);
    //结果为:0x192  二进制:1 1101 0010
    printf("0x%X   \n", y);

    //验证方法:
    int a = (0x192 - 0xD2) >> 4;//如果刚好是12(0xc)那就说明对了,这里注意要右移4位,到默认位上去检验
    printf("0x%X   \n", a);//其结果刚好是0xc,也就是12

 以上是一些基本的操作... &运算符还有一些更强大的计算

2.位或符号是|
真值表达式为: 1|1=1,1|0=1,0|1=1,0|0=0
记忆方式:|| 我们很容易理解..其实就是假假才为假,相当于||必须两个条件为假时才为假,任何有为真的都是返回真的,这样是不是很好理解.
用途:一般用于位段设置值的操作,再回到上面的例子可以再理解一下

巩固下下面的宏

//设置x的第n到m位为1 n(0开始) < m
#define SET_BIT_N_M(x, n, m)        (  x | ~(   (~0U) << (m - n +1 )   ) << n    )

这段宏的理解我们分开来理解下

第一步:~0U   => ~(0000 0000 0000 0000 0000 0000 0000 0000) => 1111 1111 1111 1111 1111 1111 1111 1111
第二步:<< (m - n+1 )这里假设为0-3 << (3 - 0 +1 ) => 左移这个位数刚好 => 1111 1111 1111 1111 1111 1111 1111 0000=>再取反=>0000 0000 0000 0000 0000 0000 0000 1111

第三步: 0000 0000 0000 0000 0000 0000 0000 1111 再左移 0位还是1111

第四步:进行与或操作,就全部是1了..是不是好理解了..

~~~~~文中说的是32位的数,这个宏在64位也是一样的..稍理解下亲就明白了.....

今天就写到这吧~~~

好久没有写,感觉不会写了..