代码中的位运算

位运算就是计算机的二进制运算方式,所有可以转换为二进制的字符数字等都可以进行位运算

位运算符 

符号名称逻辑
&两个位都为1时,结果才为1  
|两个位都为0时,结果才为0
^异或两个位相同为0,相异为1
~取反0变1,1变0
<<左移各二进位全部左移若干位,高位丢弃,低位补0
>>右移各二进位全部右移若干位,对无符号数,高位补0

using System;

namespace weiyunsuan
{
    class Program
    {
        static void Main(string[] args)
        {



         //--------------------   按位与  & 两个位都为1时,结果才为1  ----------------------

            //<1> 清零   任何数与 0按位与 最后的结果都是 0 
            int numbre = 100;
            numbre &= 0;
            //结果  numbre :0
            Console.WriteLine("numbre :" + numbre);

            /*
               原理  :    0 的二进制 是 ---> 00000000 
                       100 的二进制 是  ---> 01100100
                        结果: 0        ---> 00000000
                         两组 二进制进行 按位与 运算后所有的位结果都是0
             */

            //<2>判断奇偶  

            int numbre1 = 100;

            //结果  :numbre1 是偶数
            if ((numbre1&1)==1)
            {
                Console.WriteLine("numbre1 是奇数");
            }
            else
            {
                Console.WriteLine("numbre1 是偶数");
            }

            /*
             原理  : 
             在把 10进制转换为 2进制时 偶数 最后一位一定会是0   奇数的最后一位一定会是 1;

             100 的二进制 是  ---> 01100100
              1   的二进制 是 ---> 00000001 
              结果: 0        --->  00000001
             在进行按位与的时候  都是1才能是1 那么  任何数与1按位与只要 结果等于1 表示这个数是奇数

             */

            //----------------------------------------------------------------------------------



            //--------------------   按位或  |  两个位都为0时,结果才为0  ----------------------

            //这个没怎么研究
            //----------------------------------------------------------------------------------






            //--------------------    异或 ^ 两个位相同为0,相异为1  ----------------------

            //<1> 查找数组中 唯一的元素  也就是没有重复值的元素  这样的元素要求只有一个

            int[] num_Arr = new int[] {2,2,5,8,6,5,6};
            int singNum = num_Arr[0];
            for (int i = 1; i < num_Arr.Length; i++)
            {
                singNum ^= num_Arr[i];
            }
            //结果  :singNum 是 :8
            Console.WriteLine("singNum 是 :"+ singNum);

            /*
              原理 :    
                首先去数组中的第一个数  2  的 二进制是 ---> 00000010
                                      2  的 二进制是 ---> 00000010                    
                                     结果是   :      ---> 00000000     结果数是 :0
              
                 第二次进行比较 :                    --->  00000000
                                     5的二进制是     ---> 00000101    
                                     结果是   :     ---> 00000101      结果数是 :5
             
                 第三次进行比较 :                    ---> 00000101
                                     8的二进制是     ---> 00001000    
                                     结果是   :     --->  00001101     结果数是 :13
                
                 第四次进行比较 :                    ---> 00001101
                                     6的二进制是     ---> 00000110    
                                     结果是   :     --->  00001011     结果数是 :11

                 第五次进行比较 :                    ---> 00001011
                                     5的二进制是     ---> 00000101    
                                     结果是   :     --->  00001110     结果数是 :14
             
                 第六次进行比较 :                    ---> 00001110
                                     6的二进制是     ---> 00000110    
                                     结果是   :     ---> 00001000     结果数是 :8

             */


            //<2> 交换两个整数 

            int number22 = 50;
            int number23 = -90;
            number22 = number22 ^ number23;
            number23 = number22 ^ number23;
            number22 = number22 ^ number23;
            //结果  :number22 是 :-90number23 是 :50
            Console.WriteLine("number22 是 :" + number22 + "number23 是 :" + number23);

            //<<<<<<<<<<<<   
            // 由上得出结论:
            //    两个相同的数按位异或得到的结果是  0
            //    1. 进行多次按位异或的时候有自反性   及 重复数字按位异或可以直接忽略   a^b^c^b^c= a^0 = a;    
            //    2. 结合律 (a^b)^c == a^(b^c)=c^a^b  及 按位异或 没有顺序和先后  结果是一样的
            //    3. 对于任何数和自己异或得到的结果都是0  ,任何数与0异或得到的结果都是自己 a^a =0; a^0 =a;
            //    4. 交换律 及 两个数异或 得到值 与这两个中的任意一个数进行异或都会得到另外一个数
            //
            //<<<<<<<<<<<<

            //----------------------------------------------------------------------------------




            //--------------------    取反 ~  0变1,1变0  ----------------------

            int number4 = 20;
            int number5 = -40;

            number4 = ~number4 + 1;
            number5 = ~number5 + 1;
            //结果  :number4 是 :-20  number5 是 :40
            Console.WriteLine("number4 是 :" + number4 + "number5 是 :" + number5);

            //<<<<<<<<<<<<   
            // 由上得出结论:
            //  任何数按位取反后得到的数加1 都会得到这个数相反的值
            //<<<<<<<<<<<<
            //----------------------------------------------------------------------------------



            //--------------------    左移 << 各二进位全部左移若干位,高位丢弃,低位补0  ----------------------

            int number6 = 21;
            int number7 = -40;

            number6 <<= 1;  //该算式 等于   (int)number6*(2*1)  数字*2的n次方  n是左移的位数
            number7 <<= 2;  //该算式 等于   (int)number6*(2*2)  数字*2的n次方  n是左移的位数
            //结果  :number6 是 :42  number7 是 :-160
            Console.WriteLine("number6 是 :" + number6 + "number7 是 :" + number7);


            //左移没有转换 int的类型  因为左移不会产生小数 
            //----------------------------------------------------------------------------------


            //--------------------    右移 >> 各二进位全部右移若干位,对无符号数,高位补0,有符号数----------------------
            //同上 相反操作
            int number8 = 21;
            int number9 = -39;

            number8 >>= 1;  //该算式 等于   (int)number6/(2*1)  数字/2的n次方  n是右移的位数
            number9 >>= 2;  //该算式 等于   (int)number6/(2*2)  数字/2的n次方  n是右移的位数
            //结果  :number8 是 :10  number9 是 :-10
            Console.WriteLine("number8 是 :" + number8 + "number9 是 :" + number9);

            //右移得到的肯定不会全是整数 所以结果会进行 转int  会直接舍弃小数部分 (根据编程语言的强转转换成int C# 会舍弃小数部分)
            //----------------------------------------------------------------------------------

        }
    }
}

目录

ASCII码 是一些字符数字字母等 对应的 二进制 十进制 数值的表

ASCII码 是一些字符数字字母等 对应的 二进制 十进制 数值的表

二进制十进制十六进制字符/缩写解释
00000000000NUL (NULL)空字符
00000001101SOH (Start Of Headling)标题开始
00000010202STX (Start Of Text)正文开始
00000011303ETX (End Of Text)正文结束
00000100404EOT (End Of Transmission)传输结束
00000101505ENQ (Enquiry)请求
00000110606ACK (Acknowledge)回应/响应/收到通知
00000111707BEL (Bell)响铃
00001000808BS (Backspace)退格
00001001909HT (Horizontal Tab)水平制表符
00001010100ALF/NL(Line Feed/New Line)换行键
00001011110BVT (Vertical Tab)垂直制表符
00001100120CFF/NP (Form Feed/New Page)换页键
00001101130DCR (Carriage Return)回车键
00001110140ESO (Shift Out)不用切换
00001111150FSI (Shift In)启用切换
000100001610DLE (Data Link Escape)数据链路转义
000100011711DC1/XON
(Device Control 1/Transmission On)
设备控制1/传输开始
000100101812DC2 (Device Control 2)设备控制2
000100111913DC3/XOFF
(Device Control 3/Transmission Off)
设备控制3/传输中断
000101002014DC4 (Device Control 4)设备控制4
000101012115NAK (Negative Acknowledge)无响应/非正常响应/拒绝接收
000101102216SYN (Synchronous Idle)同步空闲
000101112317ETB (End of Transmission Block)传输块结束/块传输终止
000110002418CAN (Cancel)取消
000110012519EM (End of Medium)已到介质末端/介质存储已满/介质中断
00011010261ASUB (Substitute)替补/替换
00011011271BESC (Escape)逃离/取消
00011100281CFS (File Separator)文件分割符
00011101291DGS (Group Separator)组分隔符/分组符
00011110301ERS (Record Separator)记录分离符
00011111311FUS (Unit Separator)单元分隔符
001000003220(Space)空格
001000013321!
001000103422"
001000113523#
001001003624$
001001013725%
001001103826&
001001113927'
001010004028(
001010014129)
00101010422A*
00101011432B+
00101100442C,
00101101452D-
00101110462E.
00101111472F/
0011000048300
0011000149311
0011001050322
0011001151333
0011010052344
0011010153355
0011011054366
0011011155377
0011100056388
0011100157399
00111010583A:
00111011593B;
00111100603C<
00111101613D=
00111110623E>
00111111633F?
010000006440@
010000016541A
010000106642B
010000116743C
010001006844D
010001016945E
010001107046F
010001117147G
010010007248H
010010017349I
01001010744AJ
01001011754BK
01001100764CL
01001101774DM
01001110784EN
01001111794FO
010100008050P
010100018151Q
010100108252R
010100118353S
010101008454T
010101018555U
010101108656V
010101118757W
010110008858X
010110018959Y
01011010905AZ
01011011915B[
01011100925C\
01011101935D]
01011110945E^
01011111955F_
011000009660`
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
011110111237B{
011111001247C|
011111011257D}
011111101267E~
011111111277FDEL (Delete)删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值