位操作

>>

右移运算符,右移一位相当于这个数除以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基础 - 位操作的更多相关文章

  1. C语言常用基础位操作

    1.使用下面的代码将最右边的1改变为0,假如没有1则结果为0(e.g.,01011000=>01010000): x &  (x-1) 此代码可以用来判断一个无符号的整数是否为2的幂,假 ...

  2. Go基础之--位操作中你所不知道的用法

    之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础 位操作符 与操作:&1 & ...

  3. C++:位操作基础篇之位操作全面总结

    位操作篇共分为基础篇和提高篇,基础篇主要对位操作进行全面总结,帮助大家梳理知识.提高篇则针对各大IT公司如微软.腾讯.百度.360等公司的笔试面试题作详细的解答,使大家能熟练应对在笔试面试中位操作题目 ...

  4. Java基础东西(按位操作运算)

    http://aokunsang.iteye.com/blog/615658 前奏:   昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊, ...

  5. 基础 - 32位操作系统最多只支持4G内存。

    32位操作系统最多只支持4G内存. CPU能不能直接访问硬盘的数据呢, 不能. 只能通过把硬盘的数据先放到内存里, 然后再从内存里访问硬盘的数据.我们平时玩游戏碰上读图loading 进度条的这个过程 ...

  6. 零基础学python-5.6 数字位操作与其它工具

    1.位运算 python能够把整数当成二进制位来对待 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/ ...

  7. [C++基础] 变量、关键字、运算符、位操作篇

    一.变量篇 1 全局变量和静态变量有什么异同? 相同:都在静态存储区分配空间,生命周期与程序生命周期相同. 区别:全局变量的作用域是整个程序,它只需要在一个源文件中定义,就可以作用于所有的源文件.而静 ...

  8. C语言基础知识(四)——位操作

    一.进制基础知识 1.通常,1字节(Byte)包含8位(bit).C语言用字节表示储存系统字符集所需的大小. 2.对于一个1字节8位的二进制数,最右边(第0位)是最低阶位,最左边(第1位)是最高阶位, ...

  9. JavaScript基础语法

    首先,JavaScript的基本语法是以名为ECMAScript的伪语言定义的,理解ECMAScript的细节就是理解它在浏览器中实现的关键,目前大多数浏览器都遵循了ECMAScript第3版的,但是 ...

  10. iOS-C基础

    iOS开发系列--C语言之基础知识 概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(i ...

随机推荐

  1. elk收集分析nginx日志,并绘制图形

    一.修改nginx配置 把nginx日志修改成json格式,在nginx.conf中添加如下内容,重启nginx. log_format log_json '{"@timestamp&quo ...

  2. 【Java】字符串常用操作

    字符的常用技巧 char c; 字母的顺序:c - 'A'.c - 'a' 字母大小写转换:c - 'a' + 'A'.c - 'A' + 'a' 数字字符转换为数字:c - '0' String.S ...

  3. 使用Python进行切比雪夫插值

    引言 在科学计算中,插值是一个非常重要的概念.简单来说,插值就是通过已知的离散数据点来估算未知点的值.今天,我们将重点介绍切比雪夫插值,它是一种非常有效的插值方法,特别适用于解决插值多项式高次时出现的 ...

  4. Hangfire Redis 实现秒级定时任务、使用 CQRS 实现动态执行代码

    目录 定时任务需求 核心逻辑 使用 Redis 实现秒级定时任务 第一步 第二步 第三步 第四步 业务服务实现动态代码 第一步 第二步 第三步 第四步 第五步 最后 定时任务需求 本文示例项目仓库:w ...

  5. Vue横向滚动鼠标控制

    let level_cards // 标记可移动 , move_start // 移动初始的x位置 , move_x // 移动初始的容器偏移量 , move_scroll_left // 判断是否为 ...

  6. 关于composer报错The openssl extension is required for SSL/TLS protection but is not available问题

    今天使用composer的时候得到了这个错误: The openssl extension is required for SSL/TLS protection but is not availabl ...

  7. 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持

    我在前面随笔中介绍了在SqlSugar的开发框架中实现EAV模型(实体-属性-值)的处理,这个EAV模型实现的目的是支持弹性化的数据库设计,可以自由扩展数据库表字段和数据的查询和存储,实现的思路是在常 ...

  8. Spring Boot 不能加载 tcnative-2.dll 库(Can't load library: tcnative-2.dll)

    Spring Boot 不能加载 tcnative-2.dll 库 本文将介绍怎样解决 Spring Boot 在启动时抛出 "org.apache.tomcat.jni.LibraryNo ...

  9. jdk源码目录说明

  10. 莫想到有一天得重新写个 etcd client

    莫想到有一天得重新写个 etcd client 其实8年前搞过一个, 不过经过8年时间,etcd 多了很多功能 ,原来的多半不行了 虽然暂时我也没啥需求,但是怕kv和watch有变化 而且其实通过 g ...