二进制位运算

1.  数的原码补码转换  

  计算机运算中,数都是由补码表示的。正数的补码就是原码;负数的补码就是各位(包括符号位)取反,再加上1。假设数是8位的,最高位为符号位。1的补码是0x00000001,-3的补码是0xFFFFFFFD。

  如果由补码转化为原数:正数不变;负数的补码是各位(包括符号位)取反,再加上1得到负数的绝对值,再贴上符号。补码0x00000010的数是1,补码0xFFFFFFE4的数的绝对值是000111002=2810,则该数是-28。

  下面代码的输出是-30:

1 #include <stdio.h>
2
3 int main() {
4     int myInt;
5     myInt = 0xFFFFFFE2;
6     printf("%d\n",myInt);
7
8     return 0;
9 }

2. 对负数取补码,为什么要对绝对值的原码取反加1?

  以-75为例。注意,7510=010010112。对-75取得它的机器表示,也就是0-75,下面是转换的过程:

  可以看到,-75的机器表示的过程=28-75=11111111+1-01001011=11111111-01001011+1。而11111111-01001011相当于对75取反码,所以-75的取补码过程就是对75先取反码,然后加1。所以,推广得来看,对于负数的补码,要对该负数的绝对值的原码取反加1。

参考:

https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html#fromtwo

https://en.wikipedia.org/wiki/Two%27s_complement

时间: 2024-08-25 16:19:19

二进制位运算的相关文章

[C++基础]原码/反码/补码、二进制位运算

原码/反码/补码 编码 定义 实例 原码 最高位为符号位,"0"表示正,"1"表示负,其余位表示数值的大小. [+100]原=01100100 [+0]原=00000000 [-100]原=11100100 [-0]原=10000000注意:在原码中,零有两种表示形式. 反码 正数的反码与其原码相同:负数的反码是对其原码逐位取反,但符号位除外. [+100]反=01100100 [+0]反=00000000 [-100]反=10011011[-0]反=1111111

七、 二进制位运算

判断一个 字符串在不在一个列表里 1 name_list = [1,2,3,4,5,'a','b',] 2 name_list2 = ['q','w','e','r',] 3 #判断 4 是否在name_list2这个列表里 4 w = 4 in name_list2 5 e = 4 in name_list 6 #如果存在则 返回Ture 如果不存在则返回 Fales 7 print(w) 8 print(e) 9 10 ###加上判断包含的话 11 if 4 in name_list: 12

人造奇迹——二进制位运算的运用

最后更新:2014年4月30日 1.位运算包括: 这个我觉得大家都会我就随便说下: 位与&,如 101 & 110 = 100 位或|,如 100 | 110 = 110 位非~,如 ~101 = 010 位异或^,如 101 ^ 110 = 011 左移<<,如 011 << 1 = 110 右移>>,如 110 >> 1 = 011 其中,负数位运算的时候,用的是补码而不是原码请注意. 左移的时候,高位溢出的将会被舍弃,低位补0.如 11

二进制位运算几个常用的技巧

1. 奇数偶数 对于一个正整数的二进制,如果是偶数,那么最低位一定是0,相反如果是奇数,最低位一定是1.比如4(0100),3(0011)等等.因此通过对一个整数的二进制最低位的可以判断其是奇数还是偶数. 对正整数a,判断奇偶可以通过(a&0x1)来判断,是1则是奇数,是0则是偶数. 将一个奇数转成比他小的偶数,(a&-2). 2. 右移1(>>1) a>>1其实就是a/2:

2015.8.5 循环与函数、位运算

注意点: 1.只有整形才可以用switch. 2.case后面的常量不可以重复 3.default语句可以放在任意位置,但是后面不可以省略break: while: 1.用来处理一些重复执行的操作 2.确定循环终止的条件 (1)在循环开始之前,需要定义一个循环控制变量并将其初始 (2)确定循环的约束条件 (3)在每一次循环结束的时候,在循环中,要去改变循环控制变量的值,让它不间断接近约束条件 注意点: 1.在c语言总任何树枝都有真假性,只有0为 假,其它都为真 2.注意不把==和=混淆了,为了避

POJ--2570--Fiber Network【floyd+位运算】

题意:一些公司决定搭建一些光纤网络,单向的,如果从第一点到第二点,有ab两个公司可以搭建,第二点到第三点有ac两个公司可以搭建,第一点到第三点有d公司可以搭建,则第一点到第三点有a.d两个公司可以搭建,a是通过第二点,d是直接连接两点.现在给你这么一个光纤网络,问某两点之间有哪些公司可以搭建起网络. 首先这题是个多源点的,有点像最短路的思想,如果让我做我肯定硬着头皮找相同的字母,不过我看到图论书里的想法很好,就写上来了. 因为公司是用一个小写字母来标识的,且每个公司的标识互不相同,也就是说最多只

位运算 F Alice and Bob

题目传送门 1 /* 2 题意: 求(a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1) 式子中,x的p次方的系数 3 二进制位运算:p = 2 ^ i + 2 ^ j + 2 ^ k + ...,在二进制表示下就是1的出现 4 例如:10 的二进制 为1010,10 = 2^3 + 2^1 = 8 + 2,而且每一个二进制数都有相关的a[i],对p移位运算,累计取模就行了 5 */ 6 #include <cstdio

二进制运算基础

# 一.二进制位运算 1. 按位与(&) ??位运算实质是将参与运算的数字转换为二进制,而后逐位对应进行运算. ??按位与运算为:两位全为1,结果为1,即1&1=1,1&0=0,0&1=0,0&0=0. ??例如51 & 5 -> 00110011 & 00000101 = 00000001 -> 51 & 5 = 1 ??特殊用法: ??(1)与0相与可清零. ??(2)与1相与可保留原值,可从一个数中取某些位.例如需要取101

java笔记2

1      关键字 1.1    关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. 1.2    常见的关键字 备注:不必死记硬背,如果使用关键字作为标识符,编译器能提示错误. goto 是java的保留关键字,意思是java并没有使用goto,以后是否使用未定. 2      标识符 2.1    什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程