用异或代替按位求反

按位取反,意思是原来的每一位,1变0,0变1。

按照这个1变0,0变1的标准,若求x的按位取反值,可以用求异或来替代。

异或的本质是模二加,效果是相同为1,相异为0。

对于x = 10101,想要用异或来达到按位取反的效果,就得找出一个特殊的数。令这个数为y,有:

10101
^         y
_________
    01010

可以发现,y只能是11111,即和x的二进制位数相等的全1。

即若x为一个32位的数,则有 ~x = x ^ 0xffffffff。

写代码的时候出现了一些“奇怪”的事情。在vc6.0中有:

;int a = 3;
mov         dword ptr [ebp-0Ch],3

;int b = a ^ 0xffffffff;
00405027   mov         ecx,dword ptr [ebp-0Ch]
0040502A   xor         ecx,0FFh
0040502D   mov         dword ptr [ebp-14h],ecx

源代码给的是0xffffffff,但汇编代码中出现是0xff,只有8位,而且计算结果是对的。

如果只是让a和0xff相异或的话,结果肯定不对。

这里把源代码的0xffffffff换成-1,则有:

;b = a ^ -1;
mov         ecx,dword ptr [ebp-0Ch]
xor         ecx,0FFh
mov         dword ptr [ebp-14h],ecx

看来这里应该是用0xff代表-1,并对0xff进行了扩展变为0xffffffff,否则结果不对。

但是源代码直接写0xff或0xffff看来是不行的。

时间: 2024-08-10 21:21:59

用异或代替按位求反的相关文章

位运算反(~)与(&)异或(^)或(|)右移(>>)左移(<<)

先知道这两个二进制数据的特点:   1=0000 0000 0000 0000 0000 0000 0000 0001 -1=1000 0000 0000 0000 0000 0000 0000 0001 1.最高位(首位)表示正负(0为正,1为负) 2.最低位(末位)表示奇偶(0为偶,1为奇) 一.按位取反(~) 十进制1按位取反后=? 分析: 1. 十进制1转为二进制为:1= 0000 0000 0000 0000 0000 0000 0000 0001 2. 按位取反:把原来的二进制得到一

HDU 5344 多个数的和异或-思维-(位运算)

题意:n个数的两两做和,然后异或 分析: 异或的性质:两个相同的数异或为0,所以Ai+Aj异或Aj+Ai等于0,所以最终结果就是Ai+Ai的异或 代码: #include<stdio.h> long long t,n,m,z,l; long long a[1000005]; int main() { scanf("%I64d",&t); while(t--){ scanf("%I64d%I64d%I64d%I64d",&n,&m,

RISC处理器设计(二)------指令集的设计

定义指令字长为32位,并把寄存器堆扩展到32个通用32位寄存器.一套包含8个寄存器的寄存器堆,对于一个优化好的进程,足够安排所有的本地变量.采用寄存器窗技术可以提高系统的吞吐率.使CPI<1.一套32位寄存器阵列能够实现4个嵌套深度的进程. 1.指令格式的设计 指令可以分为四大类: 类别 说明 运算类 寄存器数据算术逻辑运算 访存类 主存储器访问(Load/Store) 跳转类 分支跳转(控制转移.条件与非条件) 特殊类 对诸如程序计数器PC等特殊寄存器操作的特殊指令 指令格式可以分为两大类:访

位运算之 C 与或非异或

位运算比较易混: 位运算之 C 与或非异或 与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:~ 1取0,0取1 ~1 = 0, ~0 = 1 ~(10001) = 01110 异或运算:^ 两者相等为0,不等为1(易混淆) 1^1=0, 1^0=1, 0^1=1, 0^0=0 位移操作符:<&

位运算符详解

运算符   含义   &   按位与   |   按位或   ∧   按位异或   ∽   取反   <<   左移   >>   右移 说明: 1.位运算符中除∽以外,均为二目(元)运算符,即要求两侧各有一个运算了量. 2.运算量只能是整形或字符型的数据,不能为实型数据. “按位与”运算符(&) 规定如下: 0&0=0   0&1=0   1&0=0   1&1=1 例:3&5=?                      

黑马程序员——c语言学习心得——位运算符

黑马程序员——c语言学习心得——位运算符 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 1. 按位与运算 按位与运算符"&"是双目运算符.其功能是参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果位才为1 ,否则为0.参与运算的数以补码方式出现. 例如:9&

C++的6种位运算符

一.C语言的六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 1.按位与运算 按位与运算符"&"是双目运算符. 其功能是参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果位才为1 ,否则为0.参与运算的数以补码方式出现. 例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&

OJ随笔——【1102-海明距离】——位运算

题目如下: Description 海明距离是在指二进制情况下,一个整数变成另外一个整数需要翻转的位数.比如2转换到3需要翻转1位,所以2到3的海明距离是1.给你两个正整数x和y,(x,y<=1,000,000,000)求它们的海明距离. 输入 第一行是一个整数N,表示样例的个数.以后每行两个整数x和y. 输出 每行输出一个整数,及对应样例的结果.   Sample Input 2 1 2 4 7   Sample Output 2 2 分析思路: 简单来说就是一个多样例输入,对于每一组输入都转

位运算基本概念及简单运用

C语言提供了六种位运算符: &     按位与    |      按位或    ^      按位异或    ~      取反    <<    左移,相当与*2    >>    右移,正数高位补0,负数由计算机决定 循环左移k次 (x<<k) | (x >> (32-k)), 循环右移k次 (x>>k) | (x << (32-k)) 当然常常应为优先级问题而犯错~~~ 优先级及口诀如下 优先级别 运算符 记忆口诀 1