关于C语言逻辑运算符的应用
来源:互联网 发布:php 注入过滤 编辑:程序博客网 时间:2024/05/17 09:30
最近在看C语言的一本书《The C programming language(中文版)》,上面有几个关于逻辑运算的小问题比较有意思。
你也可以去这个博客上看一下。 这个博客关《The C programming language(中文版)》这本书上习题的答案比较全面。这里主要讲一下C语言逻辑运算符&(与)、|(或)、~(非)、^(异或)。
&(与):只有当两个数都为1时,结果才为1。即1&1=1,0&1=0,1&0=0,0&0=0。
|(或):只要有一个数为1时,结果就为1。即1|1=1,0|1=1,1|0=1,0|0=0。
~(非):所有的数都取反。即~1=0,~0=1。
^(与):只有当两个数不相同时,结果才为1。即1^1=0,0^1=1,1^0=1,0^0=0。
这里我们就总结一个问题:
&(与):a&1结果是什么?a&0呢?
|(或):a | 1结果是什么?a | 0呢?
^(与):a^1结果是什么?a^0呢?
结论:
a&1 = a , a&0 = 0 , a | 1 = 1 , a | 0 = a , a^1 = ~a , a ^ 0 = a 。
这就相当于一个公式了。
这里给一个数10001001111 , 让你用逻辑运算符取出这个数中间的三位数,并输出。
这时候你会怎么思考?
.
.
.
.
思
考
的
时
间
.
.
.
.
我会把这个分成三部分:1000 | 100 | 1111 。其中中间加粗的100是我们要取出的值。要想取出,首先要把100两边的值都变为0,即变成0000 | 100 | 0000。怎么样才能变成这个样子呢?看上边的公式,结果为0的只有一个a & 0 = 0,这里我们就可以确定用&(与)运算了。我们取的值要保持不变,这时候就一看a&1 = a,保持不变。那么我们就用1000 | 100 | 1111 & 0000 | 111 | 0000 就得到了 0000 | 100 | 0000,然后再右移4位(>>4)就得到了你想要的值。
那么0000 | 111 | 0000怎么得到呢?
结果:
0 = 0000 000 0000 ——>
0取反得: ~0 = 1111 111 1111 ——>
~0左移3位:~0 << 3 = 1111 111 1000 ——>
再将得到的数取反:~(~0<<3) = 0000 000 0111——>
再左移4位:~(~0<<3)<<4 = 0000 111 0000。
就得到了想要的结果。
那我们再来思考一个问题,如果只让上边的数中间的三位改变,该怎么办呢。也就是两边的数不变,那么结果为a的公式中有三个a&1 = a,a | 0 = a,a ^ 0 = a。然后根据要求去获得相应的数字,然后一步步的变换。
免费的《The C programming language(中英文版)》(码云)
csdn上《The C programming language(中英文版)》1积分
- 关于C语言逻辑运算符的应用
- C语言中移位、逻辑运算符的简单应用
- C语言逻辑运算符
- C语言逻辑运算符
- C语言中逻辑运算符的陷阱
- C语言中的逻辑运算符
- C语言(10)------逻辑运算符
- C语言中的逻辑运算符
- 53 C语言逻辑运算符
- C的逻辑运算符
- c语言位运算符与逻辑运算符的区别
- C语言中逻辑运算符的短路效应
- C语言逻辑运算符中真假的概念
- C语言逻辑运算的短路特性
- 关于逻辑运算符的理解
- 关于C语言中逻辑运算和位运算的差别(记一笔)
- c语言逻辑运算符使用分析.
- C语言位操作--逻辑运算符组合
- MySql数据库插入数据乱码
- hdu5074-递推-Hatsune Miku
- CSDN博客积分规则
- python web框架django入门
- RadioButton
- 关于C语言逻辑运算符的应用
- 制作申请表
- if else 多分支 与for循环
- Java NIO Channel 通道
- 6-11 求自定类型元素序列的中位数(25 分)
- [IOS笔记]改变UIButton中图片和文字的位置 xib与故事版的差别
- 1018. 锤子剪刀布 (20)
- 一种可行的持续集成架构介绍
- 【LeetCode算法练习(C++)】 ZigZag Conversion