C语言 位操作】的更多相关文章

c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. 循环移位的概念: 循环移位就是把从左边移出去的,补到右边去,或者从右边移出去的补到左边去,例如1000 0001循环右移以为得到:1100 0000,循环左移一位得到0000 0011 掩码的概念: 掩码就是掩盖住你不想让它出现的部分,例如在网络中的子网掩码,就是将网络中的子网内部IP划分屏蔽掉,例…
位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占16位,位操作将每一位单独操作. 位操作允许程序员设置.清除.测试与其他的操作,这些操作如下表: 操作 含义 & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 这些操作用于整型或者字符型 1.按位与(&) Bit1 Bit2 Bit1 & Bit2 0 0 0 0 1 0 1 0 0 1 1 1 通常我们可把按位"与"操作 & 作为关闭某位(即将…
计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单位,其取值只能是 0 或 1. 字节(Byte) 是计算机处理数据的基本单位,通常系统中一个字节为 8 位.即:1 Byte=8 bit. 为便于演示,本节表示的原码.反码及补码均默认为 8 位. 准确地说,数据在计算机中是以其补码形式存储和运算的.在介绍补码之前,先了解原码和反码的概念. 正数的原…
下面分享关于位操作的一些笔记: 一.位操作简单介绍 首先,以下是按位运算符: 在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作.下面进行举例说明,假如有一个8位的TEST寄存器: 当我们要设置第0位bit0的值为1时,可能会这样进行设置: TEST = 0x01; 但是,这样设置是不够准确的,因为这时候已经同时操作到了高7位:bit1~bit7,如果这高7位没有用到的话,这么设置没有什么影响…
1.头文件 #ifndef _INC_BITOPERATION #define _INC_BITOPERATION #endif /* 封装了所有的位操作运算 */ #include<stdio.h> #include<stdlib.h> /************************四字节操作,如int ,long等类型**********************/ /*置位int数num的第N个位*/ void setInt(int *num, int N); /*清零in…
http://www.cnblogs.com/cpoint/category/524132.html  …
#include <stdio.h> void print(int); int main(void) { int flag = 0xffe4; print(flag); printf("\n"); flag &= 0xff; //掩码 print(flag); printf("\n"); flag |= 0x07; //打开位,将对应位置1,而其余位不变 print(flag); printf("\n"); flag &…
假设读者熟悉普通代数与布尔代数,下面是部分常见的涉及到加法.减法与逻辑运算符的组合: a.        -x=~x+1 b.           =~(x-1) c.        ~x=-x-1 d.        -~x=x+1 e.        ~-x=x-1 f.         x+y=x-~y-1 g.             =(x^y)+2(x&y) h.             =(x|y)+(x&y) i.              =2(x|y)-(x^y) j.…
信息是以比特流的方式传输的,类似01000001.在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1.为了检测到这种错误,我们可以通过“奇偶校验”来实现.假如,我们存储的数据是一个字节,8个比特位,那我们就可以计算每个字节比特位是1的个数,如果是偶数个1,那么,我们就把第九个位设为1,如果是奇数个1,那么就把第九个位设为0,这样连续9个字节比特位为1的位数肯定是奇数.这中方法叫做“奇校验”,“偶校验”和此类似.当然,在实际应用中,…
1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = (b) - (a)))) 这种交换数值a与b的方法没有使用临时变量,初始化检测a,b,如果在同一内存区,则被忽略,当然这通常不会发生,(编译器会忽略,然而无论如何都是一种优化),假如可以确 定溢出异常,于是传递无符号数异常就不会抛出. 下面的逻辑“或”运算的方法在某些机器上可能要快一些,不要使用浮点型数字.…
unsigned int v; // 判断v是否为2的幂 bool f; // f为判断的结果 f = (v & (v - 1)) == 0; // 结果为0表示不是2 的幂 // 改变表示方法,可以使用下面的方法: f = v && !(v & (v - 1));…
不用选择分支找出指定两整数中的最大值与最小值: int x; int y; // 找出x与y的最大值与最小值 int r; // r保存结果 r = y ^ ((x ^ y) & -(x < y)); // min(x, y) 在一些很少的机器上,分支比较很耗资源,而且没有条件移动指令存在,以上的实现可能比传统的方法: r = (x < y) ? x : y 要快. 即使比后者多执行两步指令.(通常,前面的方法要快) 它的工作原理如下: 如果x<y,那么-(x-y)全部为1, 结…
判断两整数是否异号: int x, y; //输入比较的两数 bool f = ((x ^ y) < 0); // 返回真,当且仅当x与y异号 说明:当x.y异号,x与y的最高位分别为0和1,取"^"后为1,结果为负数 不用选择语句得到指定整数的绝对值: int v; // 需要得到整数v的绝对值 unsigned int r; // r保存结果 int const mask = v >> sizeof(int) * CHAR_BIT - 1; r = (v + ma…
关于衡量计算操作的方法: 当为算法统计操作的数量的时候,所有的C运算符被认为是一样的操作.中间过程不被写入随机存储器(RAM)而不被计算,当然,这种操作数的计算方法,只是作为那些接近机器指令和CPU运行时间的服务.所有的操作被假设成花相同的运行时间,事实上是不正确的.有很多不同的因素决定一个系统能多快运行一段样例代码,例如:缓存大小,内存带宽,指令集合等等--.最后,建立一套标准才是衡量一种方法快过另一种方法的最好方法. 判断一个整数的符号: int v; // v为我们要判断的整数 int s…
一.指定的某一位数置1 宏 #define setbit(x,y)  x|=(1<<y) 二.指定的某一位数置0 宏  #define clrbit(x,y)  x&=~(1<<y) 三.指定的某一位数取反 宏  #define reversebit(x,y)  x^=(1<<y) 三.获取的某一位的值          宏 #define getbit(x,y)   ((x) >> (y)&1)…
思考: 1. 如何将一个数据中的多个不连续位清位? 1. 如何将一个数据中的多个不连续位置位? 1. 如何反转一个数据中的多个不连续位(1->0, 0->1)? 基础知识:C 语言位操作 /***********位与***********/ /************************/ & = ; & = ; & = ; & = ; /***********位或***********/ /************************/ | = ; |…
编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位0).函数调用形式为getbits(value,n1,2).----简单题目遇到想不到的问题 c语言位运算经典问题: https://wenku.baidu.com/view/aa4b144410661ed9ad51f3dd.html 位运算屁屁踢: https://wenku.baidu.com/view/4ed8e1fd1711cc7930b71656.html 近在编写关于C语言位操作的程序,程序的要求如上…
主流C语言编译器介绍 关于GNU规范的语法扩展 用C语言构建一个可执行程序的流程 宏定义(无参宏定义和带参宏定义),C语言宏定义详解 条件编译,C语言条件编译详解 原码.反码.补码及位操作符,C语言位操作 预定义宏,C语言预定义的宏详解 C语言#include的用法 C语言宏的定义和宏的使用方法(#define) C语言条件编译(#if,#ifdef,#ifndef,#endif,#else,#elif)…
1.整个程序流程分析(1)整个串口通信相关程序包含2部分:uart_init负责初始化串口,uart_putc负责发送一个字节2.串口控制器初始化关键步骤(1)初始化串口的Tx和Rx引脚所对应的GPIO(查原理图可知Rx和Rx分别对应GPA0_1和GPA0_0)(2)GPA0CON(0xE0200000),bit[3:0] = 0b0010 bit[7:4] = 0b0010 (3)初始化这几个关键寄存器UCON0 ULCON0 UMCON0 UFCON0 UBRDIV0 UDIVSLOT03.…
在Go规范,^这个运算符在一元运算符和二元运算符中都出现了.那么他们分别是啥?在规范中说道:^ bitwise XOR integers这是按位异或. Go语言位操作实例 <!-- lang: cpp --> package main import ( "fmt" ) // 获取0-n之间的所有偶数 func even(a int) (array []int) { for i := 0; i < a; i++ { if i&1 == 0 { // 位操作符&a…
前两篇教程中我们学习了LED.按键.开关的基本原理,数字输入输出的使用以及两者之间的关系.我们用到了 pin_mode . pin_read 和 pin_write 这三个函数,实际上它们离最底层(至少是单片机制造商允许我们接触到的最底层)就只有一步之遥了.而学单片机要是不了解一点底层,那跟Arduino玩家还有什么区别?(为防止有忠实的Arduino粉丝骂我,我得承认还是有一小部分Arduino玩家是知道本篇教程所介绍内容的.)根本不好意思说自己学过单片机好吧.这所谓的最底层,就是数字IO寄存…
今晚是平安夜,首先祝大家平安夜快乐,明天是圣诞,祝大家圣诞快乐!!        好了,这周都特别有空,上班也非常轻松,基本就是看看内核驱动,学学安卓,没什么正事的开发活干.今晚,我们来总结一例在现实开发中非常重要的知识点----C语言的位操作.不得不说,我看到很多学习C的小伙伴都不知道到 << >> ~ !  &=~ |=这些符号的具体含义,甚至乱用,混用!!!甚至连学了几年C的都犯浑!! 所以,今天有必要再这里做这个总结,和大家一起来探讨这个常见而又难以学通的知识点. …
单片机的C语言中位操作用法 在对单处机进行编程的过程中,对位的操作是经常遇到的.C51对位的操控能力是非常强大 的.从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点. 这也是在各个领域中都可以看到C的重要原因.在这一节中将详细讲解C51中的位操作及其应 用. .位运算符 C51提供了几种位操作符,如下表所示: 运算符 含义 运算符 含义 & 按位与 ~ 取反 | 按位或 << 左移 ^ 按位异或 >> 右移 )“按位与”运算符(&) 参加…
先要了解一下C语言里所有的位运算都是指二进制数的位运算.即使输入的是十进制的数,在内存中也是存储为二进制形式. “<<”用法: 格式是:a<<m,a和m必须是整型表达式,要求m>=0. 功能:将整型数a按二进制位向左移动m位,高位移出后,低位补0. “>>”用法: 格式是:a>>m,a和m必须是整型表达式,要求m>=0. 功能:将整型数a按二进制位向右移动m位,低位移出后,高位补0 C语言中的移位操作,内容不多.不过有些地方你不注意,就疏忽了.闲…
菜单导航: 1.二进制.八进制.十进制.十六进制的相互转换 2.原码.反码.补码 3.举例证明整数在计算机内是以补码的形式存在(以负数为例) 4.整数的位操作:按位且&.或|.异或^.取反~ 5.整数的位移操作:左位移,右位移 6.整数的按位与&.位移.异或^的应用举例 一.进制转换  //关于进制转换,从网上找了几张经典图片,便于后面查询 1.二进制转十进制.八进制转十进制.十六进制转十进制 2.十进制转二进制, 十进制转八进制,十进制转十六进制 3.二进制转八进制,二进制转十六进制 4…
+ - * / (加 减 乘 除) > >= < <= (大于 大于等于 小于 小于等于) == != (测试等于 测试不等于) && || ! (逻辑与 逻辑或 逻辑非) >> << (位右移 位左移) & ! (按位与 按位或) ^ ~ (按位异或 按位取反) C/C++位操作 [写在前面] ^异或:不同为1,相同为0.可以记为:“异”为不同,不同为1. signed char 符号位是1时右 移位在左边补1.如: signed…
在对单处机进行编程的过程中,对位的操作是经常遇到的.C51对位的操控能力是非常强大的.从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点.这也是在各个领域中都可以看到C的重要原因.在这一节中将详细讲解C51中的位操作及其应用. .位运算符 C51提供了几种位操作符,如下表所示: 运算符 含义 运算符 含义 & 按位与 ~ 取反 | 按位或 << 左移 ^ 按位异或 >> 右移 )“按位与”运算符(&) 参加运算的两个数据,按二进位进行“与”…
一.进制基础知识 1.通常,1字节(Byte)包含8位(bit).C语言用字节表示储存系统字符集所需的大小. 2.对于一个1字节8位的二进制数,最右边(第0位)是最低阶位,最左边(第1位)是最高阶位,第几位表示2的指数大小. 3.1字节(8位)可存储256个值,unsigned char用1字节表示的范围是0-255,signed char用1字节表示的范围是(-128)-(+127). 4.每个8进制位对应3个二进制位,每个16进制位对应4个二进制位. 5.补码反码等与有符号整数有关的部分省略…
本篇文章主要讲述几种反转比特位的方法: 将一个32位数:abcd efgh 转置为hgfe dcba 1.常规方法 unsigned int v; // 目标待转置数 unsigned int r = v; //r保存反转后的结果,开始获取v的最低有效位 ; // 剩余需要移位的比特位 ; v; v >>= ) { r <<= ; r |= v & ; s--; } r <<= s; // 当v的最高位为0的时候进行移位 原理:   通过循环对v进行逻辑右移,每…
近期有个朋友在程序中使用了对16进制数做负数移位(编译器是gcc),本人最次产生好奇.所以研究了一些. 对一个数做负数位移位的操作是不规范的,可是是可行的. 详细样例: char tmp = 0x10; tmp = tmp << -1; 大家猜猜结果是什么.有人猜是tmp左移-1位不就是右移1位吗?结果是0x01? 非常遗憾.电脑和人脑是不一样的.结果是0 为什么呢?为了找出原因,本人进行了一些小小的測试.并做出了有根据的结果. 因为知道+0和-0的差别,所以,我首先将tmp <<…