〜操作员做什么?

时间:2010-10-17 05:17:03

标签: c cryptography

我最近在代码中看到了上面的运算符,我用Google搜索但没有发现任何内容。代码如下。请说明这个运算符实际上做了什么?

#include<stdio.h>
int main()
{
    unsigned long int i=0;
     char ch;
    char name1[20],name2[20];
    FILE *fp,*ft;
    printf("ENTER THE SOURCE FILE:");
    gets(name1);
    printf("ENTER THE DESTINATION FILE:");
    gets(name2);
    fp=fopen(name1,"r");
    ft=fopen(name2,"w");
    if(fp==NULL)
    {
        printf("CAN,T OPEN THE FILE");
    }
    while(!feof(fp))
    {
         ch=getc(fp);
         ch=~((ch^i));/*<--Here*/
        i+=2;
        if(i==100000)
        {
             i=0;
        }
     putc(ch,ft);
    }
    fclose(fp);
    fclose(ft);
    return 0;
}       

3 个答案:

答案 0 :(得分:66)

C ++中的~运算符(以及其他类C语言,如C和Java)执行bitwise NOT operation - 操作数中的所有1位都设置为0,并且所有0位都设置为0操作数设置为1.换句话说,它创建原始数字的补充

例如:

10101000 11101001 // Original  (Binary for -22,295 in 16-bit two's complement)
01010111 00010110 // ~Original (Binary for  22,294 in 16-bit two's complement)

在您的示例中,ch=~((ch^i))ch的{​​{3}}和i执行按位NOT,然后将结果分配给ch

按位NOT运算符有一个有趣的属性,当应用于bitwise XOR表示的数字时,它会更改数字的符号,然后减去一个(如上例所示)。

您可能希望熟悉two's complement,因为很难在搜索引擎上搜索运营商。更好的是,您可以获得the different operators of the C++ language,它将告诉您有关C ++运算符的信息。

答案 1 :(得分:16)

〜运算符反转所有位。因此10000001变为01111110

答案 2 :(得分:11)

它是按位补码运算符。鉴于输入

  

010011101

返回输出:

  

101100010