C基础 - 位操作
位操作
>>
右移运算符,右移一位相当于这个数除以21,右移两位相当于除以22
#include <stdio.h>
int main()
{
int a = 2;
a = a >> 1;
printf("a is %d\n", a); // a is 1
a = 7;
a = a >> 1;
printf("a is %d\n", a); // a is 3
}
<<
左移运算符,左移一位相当于这个数乘以21,右移两位相当于乘以22
#include <stdio.h>
int main()
{
int a = 2;
a = a << 1;
printf("a is %d\n", a); // a is 4
a = 7;
a = a << 1;
printf("a is %d\n", a); // a is 14
}
&
// 与:全1为1,有0就0
int x = 1, y = 2;
x & y
0001
0010
-------- &
0000
int x = 7, y = 4;
x & y
0111
0100
------- &
0100
|
// 或:有1就1,没1就0
int x=3,y=5;
x|y
0011
0101
------ |
0111
^
// 异或:相同为0,不同为1
1011
0110
------ ^
1101
~
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 10;
printf("~a is %d\n",~a);//打印输出的是~a原码的值 ~a is -11
}
//~运算符,将所有的位进行取反
//a 0000 0000 0000 0000 0000 0000 0000 1010 补码
//~a 1111 1111 1111 1111 1111 1111 1111 0101 补码
1. 将操作数的每一二进制位取反,0变1,1变0
//通过~a的补码取求~a的原码
//~a 1000 0000 0000 0000 0000 0000 0000 1010 符号位不变,其他位取反
//~a 1000 0000 0000 0000 0000 0000 0000 1011 +1 -11
//有了~a的补码,求出~a的原码
//负数,原码求补码 : 符号位不变,其他位取反,再+1
//负数,补码求原码 : 符号位不变,其他位取反,再+1
return 0;
}
原码 反码 补码
signed int a = 10;//有符号的整型变量a
a = -2;
unsigned int a = 10;//无符号的整型变量a unisgned 无符号
a= -10;
%u
对于有符号的变量,最高位代表的是符号位
最高位是1,是负数
最高位是0,是正数
1. signed int:有符号整数,可以表示正数和负数。
2. unsigned int:无符号整数,只能表示正整数,使用补码表示。
3. a = -2; 为有符号整数a赋负值是合法的。
4. a = -10; 为无符号整数a赋负值会出现问题,因为无符号整数不支持负数。
5. %u格式符用于打印无符号整数,输出结果会将负数以 unsigned 无符号整数形式输出。
具体来说:
signed int a = 10; // 定义有符号整数a,赋初值10
a = -2; // 合法,有符号整数支持负数,a现在值-2
unsigned int a = 10;// 定义无符号整数a,赋初值10
a= -10; // 错误,无符号整数不支持负数赋值
正数: 原码 == 反码 == 补码
负数: 原码 == 反码(符号位不变,其他位取反), == 补码(反码+1)
1
原码
0000 0000 0000 0000 0000 0000 0000 0001
反码
0000 0000 0000 0000 0000 0000 0000 0001
补码
0000 0000 0000 0000 0000 0000 0000 0001
-1
原码
1000 0000 0000 0000 0000 0000 0000 0001
反码(符号位不变,其他位取反)
1111 1111 1111 1111 1111 1111 1111 1110
补码(反码+1)
1111 1111 1111 1111 1111 1111 1111 1111
1+ -1 == 0
1补码
0000 0000 0000 0000 0000 0000 0000 0001
-1补码
1111 1111 1111 1111 1111 1111 1111 1111
0000 0000 0000 0000 0000 0000 0000 0000
原码表示正数时,最高位是0,其他位表示数值。原码表示负数时,最高位是1,其他位表示数值的绝对值。
例如:
正数5的原码:0000 0101
负数-5的原码:1000 0101
但是,原码存在一个问题,就是正负数可能出现相同的码。例如,
原码1000 0001既可以表示-1,也可以表示+129。
为了解决这个问题,提出了补码的概念。补码规则是:
1. 正数的补码与其原码相同。
2. 负数的补码是对其原码取反,然后加1。
所以,补码满足:
补码 = 原码 (如果是正数)
补码 = ~原码 + 1 (如果是负数)
因此,补码解决了正负数可能出现相同码的问题,它是一种唯一标识整数的方法,这也是补码被计算机底层广泛采用的原因。
总结一下,补码的特点是:
1. 正数的补码和原码相同
2. 负数的补码是对原码取反后加1
3. 补码可以唯一标识整数
4. 计算机采用补码来表示整数
内存中存储的起始是补码的二进制,在参与移位时,移动的都是补码;也就是说只要是整数内存中存储的是二进制的补码;
在给我们显示时打印出的都是原码,按原码来变幻成各种进制的值,我们一般都是十进制。
简单来说就是:打印原码,存储补码。反码一般用不到,在那种专门考察题中会遇到。
C基础 - 位操作的更多相关文章
- C语言常用基础位操作
1.使用下面的代码将最右边的1改变为0,假如没有1则结果为0(e.g.,01011000=>01010000): x & (x-1) 此代码可以用来判断一个无符号的整数是否为2的幂,假 ...
- Go基础之--位操作中你所不知道的用法
之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础 位操作符 与操作:&1 & ...
- C++:位操作基础篇之位操作全面总结
位操作篇共分为基础篇和提高篇,基础篇主要对位操作进行全面总结,帮助大家梳理知识.提高篇则针对各大IT公司如微软.腾讯.百度.360等公司的笔试面试题作详细的解答,使大家能熟练应对在笔试面试中位操作题目 ...
- Java基础东西(按位操作运算)
http://aokunsang.iteye.com/blog/615658 前奏: 昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊, ...
- 基础 - 32位操作系统最多只支持4G内存。
32位操作系统最多只支持4G内存. CPU能不能直接访问硬盘的数据呢, 不能. 只能通过把硬盘的数据先放到内存里, 然后再从内存里访问硬盘的数据.我们平时玩游戏碰上读图loading 进度条的这个过程 ...
- 零基础学python-5.6 数字位操作与其它工具
1.位运算 python能够把整数当成二进制位来对待 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/ ...
- [C++基础] 变量、关键字、运算符、位操作篇
一.变量篇 1 全局变量和静态变量有什么异同? 相同:都在静态存储区分配空间,生命周期与程序生命周期相同. 区别:全局变量的作用域是整个程序,它只需要在一个源文件中定义,就可以作用于所有的源文件.而静 ...
- C语言基础知识(四)——位操作
一.进制基础知识 1.通常,1字节(Byte)包含8位(bit).C语言用字节表示储存系统字符集所需的大小. 2.对于一个1字节8位的二进制数,最右边(第0位)是最低阶位,最左边(第1位)是最高阶位, ...
- JavaScript基础语法
首先,JavaScript的基本语法是以名为ECMAScript的伪语言定义的,理解ECMAScript的细节就是理解它在浏览器中实现的关键,目前大多数浏览器都遵循了ECMAScript第3版的,但是 ...
- iOS-C基础
iOS开发系列--C语言之基础知识 概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(i ...
随机推荐
- CoreOS 手动更新
以阿里云 ECS 安装的 CoreOS 为例,你家装的 CoreOS 基本也一样啦. 查看和修改更新组 第一个问题:"什么是更新组?",请先看CoreOS 发行版本介绍 # 查看更 ...
- zk基础—5.Curator的使用与剖析
大纲 1.基于Curator进行基本的zk数据操作 2.基于Curator实现集群元数据管理 3.基于Curator实现HA主备自动切换 4.基于Curator实现Leader选举 5.基于Curat ...
- 快速定位MySQL 8.0中的慢查询语句详细步骤
步骤一.启用慢查询日志 慢查询日志是MySQL记录执行时间超过指定阈值的SQL语句 配置慢查询日志 在MySQL配置文件(如my.cnf或my.ini)中设置以下参数: slow_query_log: ...
- 判断属性值,选择性执行下一步(get element attribute指令的用法)
应用场景: 下图线下支付,在退款前需要勾选这种支付方式,否则无法实现支付. 如果在测试脚本内即加入勾选指令,那么在下次执行的时候就会再次勾选,从而造成去除勾选的操作 对比一下勾选前后,勾选框元素内容组 ...
- 浏览器js如何获取系统信息?
在浏览器中,JavaScript 无法直接获取完整的系统级信息(如硬件配置.操作系统版本等),但可以通过以下 API 获取部分与设备和浏览器相关的信息: 1. 使用 navigator 对象 ...
- php获取前一天,前一个月,前半年,前一年的时间戳
#获取前一小时strtotime("-1 hour") #获取前一天strtotime("-1 day") #获取前一周strtotime("-1 w ...
- Fastjson命令执行漏洞复现2(fastjson <=1.2.47)
一.搭建环境: 第一种:Docker一键拉取环境 htttps://github.com/vulhub/vulhub/tree/master/fastjson/1.2.47-rce 第二种:tomac ...
- VMware 17 Pro 虚拟机从下载到安装的超详细教程,解决你的所有疑问
VMware 17 Pro介绍 VMware 17 Pro是一款功能强大的虚拟机软件,适用于开发人员.测试人员.系统管理员和教育机构.它可以在一台计算机上模拟运行多台虚拟机,支持Windows.Lin ...
- Vue 3 双向绑定 API defineModel 解析
defineModel defineModel是 Vue 3.4 正式加入的 API 了.它可以简化组件间双向绑定的操作,在自定义表单类组件中非常有用. 以前的自定义双向绑定 defineModel可 ...
- 【HUST】网安|操作系统实验|实验三 内存管理
文章目录 任务 任务1 Win/Linux编写二维数组遍历程序,理解局部性的原理. 1. 提示 2. 任务代码 3. 结果及说明 任务2 Windows/Linux模拟实现OPT和LRU淘汰算法. 1 ...