精华内容
下载资源
问答
  • Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算。如 ~1 = -2 ; ~2 = -3 ; ~99 = -100
  • 对二进制的数字数据,在需要按位取反时,可以直接使用该函数。是效率最优算法。
  • 很多编程语言使用 ~ 作为一元按位取反(NOT)操作符,Go 重用 ^ XOR 操作符来按位取反: // 错误的取反操作 func main() { fmt.Println(~2) // bitwise complement operator is ^ } // 正确示例 func main() { ...

    很多编程语言使用 ~ 作为一元按位取反(NOT)操作符,Go 重用 ^ XOR 操作符来按位取反:

    // 错误的取反操作
    func main() {
        fmt.Println(~2)        // bitwise complement operator is ^
    }
    
    
    // 正确示例
    func main() {
        var d uint8 = 2
        fmt.Printf("%08b\n", d)        // 00000010
        fmt.Printf("%08b\n", ^d)    // 11111101
    }
    

    同时 ^ 也是按位异或(XOR)操作符。

    一个操作符能重用两次,是因为一元的 NOT 操作 NOT 0x02,与二元的 XOR 操作 0x22 XOR 0xff 是一致的。

    Go 也有特殊的操作符 AND NOT &^ 操作符,不同位才取1。

    func main() {
        var a uint8 = 0x82
        var b uint8 = 0x02
        fmt.Printf("%08b [A]\n", a)
        fmt.Printf("%08b [B]\n", b)
    
        fmt.Printf("%08b (NOT B)\n", ^b)
        fmt.Printf("%08b ^ %08b = %08b [B XOR 0xff]\n", b, 0xff, b^0xff)
    
        fmt.Printf("%08b ^ %08b = %08b [A XOR B]\n", a, b, a^b)
        fmt.Printf("%08b & %08b = %08b [A AND B]\n", a, b, a&b)
        fmt.Printf("%08b &^%08b = %08b [A 'AND NOT' B]\n", a, b, a&^b)
        fmt.Printf("%08b&(^%08b)= %08b [A AND (NOT B)]\n", a, b, a&(^b))
    }
    
        10000010 [A]
        00000010 [B]
        11111101 (NOT B)
        00000010 ^ 11111111 = 11111101 [B XOR 0xff]
        10000010 ^ 00000010 = 10000000 [A XOR B]
        10000010 & 00000010 = 00000010 [A AND B]
        10000010 &^00000010 = 10000000 [A 'AND NOT' B]
        10000010&(^00000010)= 10000000 [A AND (NOT B)]
    展开全文
  • 按位取反

    2020-11-05 22:22:30
    按位取反 进制十进制十六进制 十进制 此部分摘抄于该博客 假设要对正数9按位取反——> (~9),计算步骤如下, 原码为 0000 1001, 反码为 0000 1001, 补码为 0000 1001, (正数的原码=反码=补码) 对其取反 1111...

    按位取反 进制

    十进制

    此部分摘抄于该博客
    假设要对正数9按位取反——> (~9),计算步骤如下,

    原码为 0000 1001,

    反码为 0000 1001,

    补码为 0000 1001,
    (正数的原码=反码=补码)
    对其取反 1111 0110(符号位一起进行取反,这不是反码更加不是最终结果,只是补码的取反仅此而已)

    我们还需要把他转换成原码,因为是负数所以进行负数补码到原码的逆运算

    先减1得反码: 1111 0101

    取反得原码:1111 1010,(反码和原码是一个相对的概念,对反码取反就是原码。取反过程符号位是不变的哦)

    前面4个1是符号位,1是负数,既得十进制:-10

    这里步骤就是:

    1. 先对正数求补码(就是原码本身)

    2. 然后对补码取反,包括符号位

    3. 最后进行一个补码求原码的过程,一定要搞清概念啊。


    下面我们再反推计算 (~ -10)

    -10的原码:1111 1010

    -10的反码:1111 0101 (符号位不变)

    -10的补码:1111 0110 (符号位不变,末位+1)

    补码取反:0000 1001 (符号位一起取反)

    这是一个正数,那么我们对其求原码就可得到最终结果?

    因为正数的补码,反码,原码都是一样的 那我们的最终结果是 0000 1001 ,十进制是 9,这与我们前面推算出的结果吻合。


    printf("%d\n",~7)//十进制输出 :-8

    之所以出现-8在于结果溢出,比如

    printf("%u\n",~7)//十进制输出 :4294967288

    因此,输出结果为-8在于超过了int的范围


    最后一个有趣的事实是:

    1. 所有正整数的按位取反是其本身+1的负数

    2. 所有负整数的按位取反是其本身其绝对值-1

    3. 零的按位取反是 -1(0在数学界既不是正数也不是负数)
    eg:234
    在这里插入图片描述

    十六进制

    正数比如234 如图所示在这里插入图片描述
    负数
    同正数的十进制做法,只不过最后以十六进制输出
    在这里插入图片描述
    十进制的99即为十六进制的63

    展开全文
  • js代码-按位取反-------

    2021-07-16 15:59:36
    js代码-按位取反-------
  • 按位取反的工作原理

    2021-05-13 17:09:25
    在了解是什么按位取反之前,首先要知道数据在内存中是以二进制补码的形式存放。 比如:-1 -1的原码:10000000000000000000000000000001 -1的反码:11111111111111111111111111111110 -1的补码:...

    首先搞懂 “反码”,“取反”,“按位取反(~)”,这三个概念是不一样的。

    取反(0变1,1变0)

    对于-1取反,先将-1化为二进制形式10000000000000000000000000000001,然后连同符号位一起取反(0变1,1变0),变为0111111111111111111111111111111001111111111111111111111111111110就是取反的结果。

    -1取反
    二进制:10000000000000000000000000000001
    取反:  01111111111111111111111111111110
    

    原码、反码和补码

    原码,第一位表示符号位,对于正数,符号位记为0,对于负数,符号位记为1,其余各位表示数值部分。

    //32位系统
    -1的原码:10000000000000000000000000000001
    0的原码: 00000000000000000000000000000000
    1的原码: 00000000000000000000000000000001
    

    反码,正数的反码是其本身,对于负数其符号位不变其它各位取反(0变1,1变0)。

    -1的反码:11111111111111111111111111111110
    0的反码: 00000000000000000000000000000000
    1的反码: 00000000000000000000000000000001
    

    补码,正数的补码是其本身,负数的补码将反码末尾加1。

    -1的补码:11111111111111111111111111111111
    0的补码: 00000000000000000000000000000000
    1的补码: 00000000000000000000000000000001
    

    数据在内存中是以二进制补码的形式存放

    在了解是什么按位取反之前,首先要知道数据在内存中是以二进制补码的形式存放。计算机只认识补码,原码和反码只是人们方便计算人为定义的。

    比如:-1

    -1的原码:10000000000000000000000000000001
    -1的反码:11111111111111111111111111111110
    -1的补码:11111111111111111111111111111111
    

    经过推导得出-1的补码是11111111111111111111111111111111,即-1在内存中是以11111111111111111111111111111111形式存放的。

    我们用VS2019验证一下。

    int main()
    {
        int a = -1;
        return 0;
    }
    

    使用VS2019->F11->调试->窗口->内存->输入&a
    在这里插入图片描述
    可以看到a的地址被存放了ff ff ff ff,这是十六进制,经过转换可以得出11111111111111111111111111111111

    按位取反

    那么按位取反是如何运行的呢?

    因为数字在内存中是以补码的形式存储的,所以按位取反首先对该数字的补码连同符号位在内一起进行取反。

    比如:对0按位取反。

    0的原码:00000000000000000000000000000000
    0的反码:00000000000000000000000000000000
    0的补码:00000000000000000000000000000000
    

    经过推导得出0的补码是00000000000000000000000000000000

    00000000000000000000000000000000进行取反得出,11111111111111111111111111111111

    但是,注意这时编译器不会直接输出现在的结果11111111111111111111111111111111。因为它是补码的取反。

    现在我们要经过逆推,推导出补码11111111111111111111111111111111的原码是什么。

    补码:11111111111111111111111111111111
    反码:11111111111111111111111111111110
    原码:10000000000000000000000000000001
    

    经过推导得知原码是10000000000000000000000000000001,即输出-1。

    写个程序验证一下

    int main()
    {
    	int a = 0;
    	printf("%d\n", ~a);
        return 0;
    }
    

    运行结果
    在这里插入图片描述
    总结:要弄懂按位取反符“~”的工作原理,必须先要弄清原码、反码和补码的转换,然后再明白按位取反在内存中是对数据的补码进行取反,还要对取反得出的结果逆推还原,还原成原码再输出。

    展开全文
  • 按位取反~运算

    2021-09-10 08:44:03
    按位取反~运算 首先我们来看按位取反的概念 按位取反运算符:对数据的每个二进制位取反,即把0变成1,把1变成0. 即~x=-x-1 这里按照定义 9的二进制为00001001 其按位取反为11110110 结果为-10 这个过程没有任何问题...

    按位取反~运算


    首先我们来看按位取反的概念

    按位取反运算符:对数据的每个二进制位取反,即把0变成1,把1变成0.

    即~x=-x-1

    这里按照定义

    9的二进制为00001001
    其按位取反为11110110
    结果为-10

    这个过程没有任何问题,但是如果忘记了负数的二进制表达方式,就会对这个结果产生疑问,为什么11110110表示-10而不是503?理解按位取反的关键是理解11110110为什么表示-10,也就是负数的二进制表达方式。

    现在计算机普遍使用补码表示负数。

    知道补码,求源码的方式是:值取反再加1。
    补码的第一位符号位决定了源码的正负,第一位为0源码为正,第一位为1源码为负。

    现在我们可以理解上面那个例子,9按位取反后得到11110110,其第一位为1,源码为负值。
    取反后为00001001,再加1得00001010,其值为10,再加上负号即为-10。

    也即 ~9=-10

    展开全文
  • 关于按位取反怎么算

    千次阅读 2020-09-21 17:43:18
    一、首先二进制在计算机的内存中是以补码的形式存储 二、正数的补码=原码=反码, 负数的反码=原码的取反(二进制数的符号位除外,一般来说在二进制的左边的最高位) 补码=反码+1 ...按位取反:1 0100 (按位取反
  • 要理解操作符,首先要理解 数字如何转换为供计算机使用的二进制数 十进制或者其他进制的数字,在计算机运算的时候,需要转换为计算机使用的二进制。 数字转换为二进制以后,还要再进行一次转换才变成供计算机使用...
  • 按位取反运算符 ~: 一元运算符,对应的二进制位,0变为1,1变为0。 分析: 由于负数的原码,补码,反码不同 因此将要进行计算: 补码—>反码—>原码 原码—>反码—>补码 原码二进制位全部将将1...
  • 按位取反~用法及原理

    千次阅读 2020-12-27 17:22:13
    按位取反是根据二进制规则来计算的: ~9 结果:-10 原码:00001001 反码:11110110 补码:10001001 修正:10001010 1是负,加1修正 转换:-0008020 -> 10 ~-9 结果:8 原码:10001001 反码:01110110 补码:...
  • Python中的按位取反

    千次阅读 2020-12-05 20:55:55
    按位取反运算符,用来对一个二进制数按位取反,即将0变1,将1变0,按理说十进制的5(0000 0101)按位取反应该为(1111 1010)十进制250,但是在Python中运算结果并非如此,结果如下: >>> ~-6 5 计算机中...
  • 按位取反运算符~

    千次阅读 2020-03-25 00:25:33
    按位取反:二进制每一位取反,0变1,1变0。 ~9的计算步骤: 转二进制:0 1001 计算补码:0 1001 按位取反:1 0110 转为原码: 按位取反:1 1001 末位加一:1 1010 符号位为1是负数,即-10 var x...
  •  &(位与)、|(位或)、^(位异或)、~ (按位取反)。  其中,按位取反运算符是单目运算符,其余均为双目运算符。  位运算符的优先级从高到低,依次为~、&、^、|,  其中~的结合方向自右至左,且优先级高于...
  • 按位取反简单易懂

    2021-04-09 07:26:40
    按位取反简单易懂 前提:计算机底层都是以补码的形式存储。 正数 以1为例: 1的二进制原码:0000 0001(原码反码补码三码一致) 1按位取反计算流程 --> 补码 0000 0001(以补码存储) ↓ 取反 1111 1110(即为...
  • 按位取反运算

    2020-12-30 16:27:30
    按位取反)运算的理解: 按照我平时的理解,当我使用按位取反运算的时候,计算机会将操作数所对应的二进制表达式的每一个位进行取反计算,取反后所得到的值就是按位取反的运算结果(这点没问题) 例如,假如我的...
  • 一次搞定按位取反(符号:~)

    千次阅读 2021-03-24 10:38:11
    正数的按位取反:+9 原码:01001 反码:01001 补码:01001 (原码1)01001——>01001(反码)—–>01001(补码)———按位取反—>10110(变负数)—–>11001(反码,负数符号位不变) — +1操作—> ...
  • 学习按位取反时,一直不是很理解,为啥对0取反就是-1,对76取反就是-77,网上有说记住x+(-x)=-1就可以了,可还是有点难懂。所以我来解释一波? 十进制数 0 的十六进制表示为 0000 0000 对其~取反后得到 1111 1111 ...
  • System.err.println("按位取反后的结果:"+bths ); } /** * 将二进制转换成16进制 * * @param buf * @return */ public static String parseByte2HexStr(byte buf[]) { StringBuffer sb = new StringBuffer(); for ...
  • 那么对其进行按位取反后,应该为:1111 1100(最开头的1为符号位),这个结果不应该是-124吗? 当然不是了,有这样理解的同学肯定是没有掌握清楚计算机中的二进制表示(原码、反码、补码),详情可以参见一下我的另...
  • 位运算符之---按位取反运算符(简单易懂)

    万次阅读 多人点赞 2019-08-07 14:59:03
    前言: 运算符是用来对二进制进行操作的 c语言中有6种运算符: & 按位与 [链接]: https://blog.csdn.net/weixin_42837024/article/details/98736834 | 按位或 [链接]:...^ 按位异或 [链接]...
  • C语言位与 位或 位异或 按位取反(二)

    万次阅读 多人点赞 2018-08-18 15:16:35
    运算是指二进制进行的运算。在系统软件中,常常需要处理二进制的问题。C语言提供了6个操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。 C语言提供的...
  • 首先,阅读这篇文章的你,肯定是一个在网上已经纠结了很久的读者,因为你查阅了所有你能查到的资料,然后他们都会很耐心的告诉你,补码:就是按位取反,然后加一。准确无误,毫无破绽。但是,你搜遍了所有俯拾即是...
  • Python中数字按位取反的方法

    千次阅读 2020-01-13 22:07:27
    Python中有个按位取反运算符:,但这个运算符并不是真正的按位取反,而是效果相当于原值乘以负一再减一,如:6 = -7. 具体原来请大家参考《Python的按位取反运算符~的简单解析》。 如果要对相关数据进行按位取反,但...
  • C语言运算符:1.按位取反运算符 " ~

    千次阅读 多人点赞 2019-03-26 23:52:08
    举个例子: #include <stdio.h> int main() { int a=7; int b=~a; print ("%d/n",b) ...打印的结果是多少呢,嘿嘿留个悬念。...第二步:对内存中的内容进行按位取反,得到的内存中的补码为: 1...
  • 以一道简单的题目为例子,来讲解按位取反(~) #include <stdio.h> int main() { int i = 0,j = 6,k = -6; i = ~i; j = ~j; k = ~k; printf("i=%d j=%d k=%d\n",i,j,k); } //求输出的i,j,k //输出...
  • 例93:学习C语言使用按位取反~。 解题思路:正数取反是先将初始数值转换成二进制数(6==》00000110),再对二进制数的每一位取反:即将0变为1、将1变为0。(00000110==》11111001),得到的是最终结果的补码,要转换...
  • 负数的反码和原码,符号一样,值取反,补码是在反码的基础上加1。 因为在计算中,二进制数在内存中以补码形式存储。 如:19 二进制表示为:00010011原码补码反码都是它;但是 -19 二进制表示为: 1001 0011 原码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 101,813
精华内容 40,725
关键字:

按位取反