国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#的幾種位操作運(yùn)算,與、或、非、異或、左移、右移

這篇具有很好參考價(jià)值的文章主要介紹了C#的幾種位操作運(yùn)算,與、或、非、異或、左移、右移。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

C#的常見幾種位操作運(yùn)算,與($)、或(|)、非(~)、異或(^)、左移(<<)、右移(>>)

位操作一般來(lái)說(shuō)比加減乘除計(jì)算要快一些

與(&)操作符

與(&)操作符的位都為1時(shí),才為1,其他都為0,因此與(&)操作符的結(jié)果范圍在[0, Math.Min(x,y)],x,y均為正整數(shù)

或(|)操作符

或(|)操作符的位都為0時(shí),才為0,其他都為1,因此或(|)操作符的結(jié)果范圍在[Math.Max(x,y), x+y],x,y均為正整數(shù)

非(~)操作符

非(~)操作符按位取反,1轉(zhuǎn)化為0, 0轉(zhuǎn)化為1,因此非(~)操作符滿足[x+~x=-1]一個(gè)數(shù)與其取反操作之和為-1

異或(^)操作符

異或(^)操作符的位不同時(shí)為1, 位相同時(shí)為0

左移(<<)操作符

左移(<<)操作符:【最左側(cè)位不要,在最右側(cè)補(bǔ)0】,相當(dāng)于乘以2個(gè)N次方,【移位是除以32后的余數(shù),范圍[0,31],即以32為一個(gè)周期】

右移(>>)操作符

右移(>>)操作符:【最右側(cè)位不要,在最左側(cè)補(bǔ)符號(hào)位。(正數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1)】,相當(dāng)于除以2個(gè)N次方,【移位是除以32后的余數(shù),范圍[0,31],即以32為一個(gè)周期】

C#新建控制臺(tái)應(yīng)用程序BitOperationDemo。

相關(guān)測(cè)試程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace BitOperationDemo
{
    class Program
    {
        /// <summary>
        /// 標(biāo)識(shí)符字典
        /// </summary>
        static readonly Dictionary<OperationSymbol, string> dict = new Dictionary<OperationSymbol, string>()
        {
            { OperationSymbol.AND,"與(&)"},{ OperationSymbol.OR,"或(|)"},{ OperationSymbol.NOT,"非(~)"},{ OperationSymbol.XOR,"異或(^)"},
            { OperationSymbol.SHIFT_LEFT,"左移(<<)"},{ OperationSymbol.SHIFT_RIGHT,"右移(>>)"}
        };
        static void Main(string[] args)
        {
            Console.SetWindowSize(120, 50);
            Console.WriteLine($"與(&)操作符的位都為1時(shí),才為1,其他都為0,因此與(&)操作符的結(jié)果范圍在[0, Math.Min(x,y)],x,y均為正整數(shù)");
            Console.WriteLine($"或(|)操作符的位都為0時(shí),才為0,其他都為1,因此或(|)操作符的結(jié)果范圍在[Math.Max(x,y), x+y],x,y均為正整數(shù)");
            Console.WriteLine($"非(~)操作符按位取反,1轉(zhuǎn)化為0, 0轉(zhuǎn)化為1,因此非(~)操作符滿足[x+~x=-1]一個(gè)數(shù)與其取反操作之和為-1");
            Console.WriteLine($"異或(^)操作符的位不同時(shí)為1, 位相同時(shí)為0");
            Console.WriteLine($"左移(<<)操作符:【最左側(cè)位不要,在最右側(cè)補(bǔ)0】,相當(dāng)于乘以2個(gè)N次方,【移位是除以32后的余數(shù),范圍[0,31],即以32為一個(gè)周期】");
            Console.WriteLine($"右移(>>)操作符:【最右側(cè)位不要,在最左側(cè)補(bǔ)符號(hào)位。(正數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1)】,相當(dāng)于除以2個(gè)N次方,【移位是除以32后的余數(shù),范圍[0,31],即以32為一個(gè)周期】");
            Console.WriteLine();
            int x = 12345;
            int y = 34567;//34567除以32,余數(shù)為7,相當(dāng)于移動(dòng)7位
            string binaryX = Convert.ToString(x, 2).PadLeft(32, '0');
            string binaryY = Convert.ToString(y, 2).PadLeft(32, '0');
            Console.WriteLine($"整數(shù)【{x}】對(duì)應(yīng)的32位二進(jìn)制為【{binaryX}】");
            Console.WriteLine($"整數(shù)【{y}】對(duì)應(yīng)的32位二進(jìn)制為【{binaryY}】");
            Console.WriteLine("-----------------下面分別用二進(jìn)制字符串邏輯處理 以及 系統(tǒng)內(nèi)置的操作符進(jìn)行操作計(jì)算-----------------");

            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.AND);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.OR);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.NOT);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.XOR);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.SHIFT_LEFT);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.SHIFT_RIGHT);

            Console.WriteLine("-----------------下面測(cè)試負(fù)數(shù)進(jìn)行操作計(jì)算-----------------");
            x = -12345;
            binaryX = Convert.ToString(x, 2).PadLeft(32, '0');
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.AND);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.OR);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.NOT);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.XOR);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.SHIFT_LEFT);
            PrintOperatorResult(x, y, binaryX, binaryY, OperationSymbol.SHIFT_RIGHT);
            Console.ReadLine();
        }

        /// <summary>
        /// 打印結(jié)果比較
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="binaryX"></param>
        /// <param name="binaryY"></param>
        /// <param name="operationSymbol"></param>
        static void PrintOperatorResult(int x, int y, string binaryX, string binaryY, OperationSymbol operationSymbol)
        {
            string binaryResult = GetOperatorResult(binaryX, binaryY, operationSymbol);
            int result = 0;
            switch (operationSymbol)
            {
                case OperationSymbol.AND:
                    result = x & y;
                    break;
                case OperationSymbol.OR:
                    result = x | y;
                    break;
                case OperationSymbol.NOT:
                    result = ~x;
                    break;
                case OperationSymbol.XOR:
                    result = x ^ y;
                    break;
                case OperationSymbol.SHIFT_LEFT:
                    result = x << y;
                    break;
                case OperationSymbol.SHIFT_RIGHT:
                    result = x >> y;
                    break;
            }
            Console.WriteLine($"{dict[operationSymbol]}操作符系統(tǒng)內(nèi)置的操作符運(yùn)算結(jié)果為【{result}】,使用二進(jìn)制字符串還原后的整數(shù)結(jié)果為【{Convert.ToInt32(binaryResult, 2)}】");
            Console.WriteLine();
        }

        /// <summary>
        /// 獲取操作符的結(jié)果
        /// </summary>
        /// <param name="binaryX">32位二進(jìn)制字符串,第一個(gè)數(shù)</param>
        /// <param name="binaryY">32位二進(jìn)制字符串,第二個(gè)數(shù)</param>
        /// <param name="operationSymbol">指定的操作符枚舉</param>
        /// <returns></returns>
        static string GetOperatorResult(string binaryX, string binaryY, OperationSymbol operationSymbol)
        {
            string result = string.Empty;
            switch (operationSymbol)
            {
                case OperationSymbol.AND:
                    result = CalculateOperatorResult(binaryX, binaryY, (left, right) => (left == '1' && right == '1') ? "1" : "0");
                    break;
                case OperationSymbol.OR:
                    result = CalculateOperatorResult(binaryX, binaryY, (left, right) => (left == '0' && right == '0') ? "0" : "1");
                    break;
                case OperationSymbol.NOT:
                    result = CalculateOperatorResult(binaryX, binaryY, (left, right) => (left == '0') ? "1" : "0");
                    break;
                case OperationSymbol.XOR:
                    result = CalculateOperatorResult(binaryX, binaryY, (left, right) => (left == right) ? "0" : "1");
                    break;
                case OperationSymbol.SHIFT_LEFT:
                    result = CalculateShiftResult(binaryX, Convert.ToInt32(binaryY, 2), true);
                    break;
                case OperationSymbol.SHIFT_RIGHT:
                    result = CalculateShiftResult(binaryX, Convert.ToInt32(binaryY, 2), false);
                    break;
            }
            Console.WriteLine($"{dict[operationSymbol]}操作符邏輯運(yùn)算的32位二進(jìn)制結(jié)果為【{result}】");
            return result;
        }

        /// <summary>
        /// 計(jì)算邏輯運(yùn)算的結(jié)果【與,或,非,異或】
        /// </summary>
        /// <param name="binaryX">32位二進(jìn)制字符串,第一個(gè)數(shù)</param>
        /// <param name="binaryY">32位二進(jìn)制字符串,第二個(gè)數(shù)</param>
        /// <param name="logicOperator">邏輯操作委托</param>
        /// <returns></returns>
        static string CalculateOperatorResult(string binaryX, string binaryY, Func<char, char, string> logicOperator)
        {
            string result = string.Empty;
            for (int i = 0; i < 32; i++)
            {
                result += logicOperator(binaryX[i], binaryY[i]);
            }
            return result;
        }

        /// <summary>
        /// 計(jì)算移位操作【左移,右移】
        /// </summary>
        /// <param name="binaryX"></param>
        /// <param name="shiftCount">移動(dòng)幾位,該數(shù)需要轉(zhuǎn)化為【除以32的余數(shù)】</param>
        /// <param name="leftShift">true代表左移,false代表右移</param>
        /// <returns></returns>
        static string CalculateShiftResult(string binaryX, int shiftCount, bool leftShift)
        {
            //比如移動(dòng)32位,就相當(dāng)于移動(dòng)0位,移動(dòng)33位,就相當(dāng)于移動(dòng)1位【32位作為一個(gè)周期】
            shiftCount = (int)((uint)shiftCount % 32U);//確保余數(shù)在0~31之間波動(dòng)
            if (leftShift)
            {
                //左移:【最左側(cè)位不要,在最右側(cè)補(bǔ)0】
                return binaryX.Remove(0, shiftCount).PadRight(32, '0');
            }
            else
            {
                //右移:【最右側(cè)位不要,在最左側(cè)補(bǔ)符號(hào)位。(正數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1)】
                return binaryX.Remove(32 - shiftCount, shiftCount).PadLeft(32, binaryX[0]);
            }
        }
    }

    /// <summary>
    /// 操作符號(hào),運(yùn)算符號(hào)
    /// </summary>
    enum OperationSymbol
    {
        /// <summary>
        /// 與 【位都是1時(shí)結(jié)果為1,否則為0】
        /// </summary>
        AND = 0,
        /// <summary>
        /// 或 【位都是0時(shí)結(jié)果為0,否則為1】
        /// </summary>
        OR = 1,
        /// <summary>
        /// 非 【位取反】,非操作只考慮第一個(gè)數(shù)
        /// </summary>
        NOT = 2,
        /// <summary>
        /// 異或 【位不同是為1,相同為0】
        /// </summary>
        XOR = 3,
        /// <summary>
        /// 左移,相當(dāng)于乘以2個(gè)N次方【最左側(cè)位不要,在最右側(cè)補(bǔ)0】
        /// </summary>
        SHIFT_LEFT = 4,
        /// <summary>
        /// 右移,相當(dāng)于除以2個(gè)N次方【最右側(cè)位不要,在最左側(cè)補(bǔ)符號(hào)位。(正數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1)】
        /// </summary>
        SHIFT_RIGHT = 5
    }
}

程序運(yùn)行如圖:

c# 或,.Net Core,C#,算法與數(shù)據(jù)結(jié)構(gòu),c#,藍(lán)橋杯,fpga開發(fā)

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-602817.html

到了這里,關(guān)于C#的幾種位操作運(yùn)算,與、或、非、異或、左移、右移的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • DevOps中的左移和右移

    DevOps中的左移和右移

    ??? 一段時(shí)間以來(lái),隨著DevSecOps、DevTestOps的出現(xiàn),表明DevOps軟件開發(fā)方法已完全成熟并進(jìn)化到了新的階段,但究其根本,仍是通過頻繁發(fā)布小型構(gòu)建來(lái)加快產(chǎn)品的生產(chǎn)速度和上線速度。作為漸進(jìn)交付的連續(xù)周期的一部分,DevOps開發(fā)團(tuán)隊(duì)采用了左移和右移的原則,以確保在這

    2024年02月11日
    瀏覽(14)
  • 藍(lán)橋杯第十三屆決賽真題-左移右移

    藍(lán)橋杯第十三屆決賽真題-左移右移

    題目鏈接 問題描述 小藍(lán)有一個(gè)長(zhǎng)度為 N 的數(shù)組, 初始時(shí)從左到右依次是 1,2,3, …N 。 之后小藍(lán)對(duì)這個(gè)數(shù)組進(jìn)行了 M 次操作, 每次操作可能是以下 2 種之一: 左移 x, 即把 x 移動(dòng)到最左邊。 右移 x, 即把 x 移動(dòng)到最右邊。 請(qǐng)你回答經(jīng)過 M 次操作之后, 數(shù)組從左到右每個(gè)數(shù)是多少? 輸

    2023年04月09日
    瀏覽(31)
  • 有符號(hào)數(shù)和無(wú)符號(hào)數(shù)左移和右移

    主要是有符號(hào)數(shù)的左移。 有的說(shuō)不管符號(hào)位,直接左移,所以可以一會(huì)正數(shù)一會(huì)復(fù)數(shù) https://bbs.csdn.net/topics/391075092 有的說(shuō)符號(hào)位不動(dòng),其他來(lái)左移 不明白了。。。。 https://blog.csdn.net/hnjzsyjyj/article/details/119721014 https://wenku.baidu.com/view/6e31935402f69e3143323968011ca300a6c3f60d.html? wkts =1

    2024年02月01日
    瀏覽(19)
  • C#針對(duì)VS線程間操作提示:程間操作無(wú)效: 從不是創(chuàng)建控件“”的線程訪問它的幾種解決方法

    C#針對(duì)VS線程間操作提示:程間操作無(wú)效: 從不是創(chuàng)建控件“”的線程訪問它的幾種解決方法

    轉(zhuǎn)載請(qǐng)標(biāo)明出處:Python Excellent的博客 此為最基礎(chǔ)方法 (入門級(jí)) 運(yùn)行效果如圖所示 * 先在按鈕事件中創(chuàng)建一個(gè)Test1()線程 * 在測(cè)試1中有兩種方法可以訪問窗體線程(首推薦) public SynchronizationContext UiContext //第一步全局聲明 UiContext = SynchronizationContext.Current; //第二部在public For

    2024年02月08日
    瀏覽(23)
  • 軟件測(cè)試流程掃盲:V/W/H模型,測(cè)試左移測(cè)試右移

    軟件測(cè)試流程掃盲:V/W/H模型,測(cè)試左移測(cè)試右移

    想了想,如何運(yùn)用在工作環(huán)境進(jìn)階一個(gè)小level:公司當(dāng)前的軟件測(cè)試模型更類似于H模型,然后測(cè)試流程也傾向于傳統(tǒng)測(cè)試流程,單元集成冒煙系統(tǒng)回歸驗(yàn)收測(cè)試,單元一般是開發(fā)自己去寫去做?!咀笠朴乙谱龅倪€不好,需要后面學(xué)習(xí)相關(guān)技術(shù)運(yùn)用在工作中】 V模型是瀑布模型

    2024年02月12日
    瀏覽(19)
  • 第十三屆藍(lán)橋杯Java B 組國(guó)賽 C 題——左移右移(AC)

    小藍(lán)有一個(gè)長(zhǎng)度為 N N N 的數(shù)組, 初始時(shí)從左到右依次是 1 , 2 , 3 , … N 1,2,3, ldots N 1 , 2 , 3 , … N 。 之后小藍(lán)對(duì)這個(gè)數(shù)組進(jìn)行了 M M M 次操作, 每次操作可能是以下 2 種之一: 左移 x x x , 即把 x x x 移動(dòng)到最左邊。 右移 x x x , 即把 x x x 移動(dòng)到最右邊。 請(qǐng)你回答經(jīng)過 M M M 次操作之后

    2024年02月02日
    瀏覽(24)
  • Python 四則運(yùn)算的幾種方法?

    Python的四則運(yùn)算主要有以下幾種方法: 1、使用基本算術(shù)運(yùn)算符: Python支持基本的算術(shù)運(yùn)算符,包括加(+), 減(-), 乘(*), 除(/) 和求模運(yùn)算符(%), 可以用于數(shù)值類型的數(shù)據(jù),例如整數(shù)(int)、浮點(diǎn)數(shù)(float)等。例如: 2、使用math模塊中的函數(shù): Python的標(biāo)準(zhǔn)庫(kù)中提供了一個(gè)math模塊,其

    2024年03月21日
    瀏覽(34)
  • 【基礎(chǔ)算法】矩陣的幾種基本運(yùn)算 & C++實(shí)現(xiàn)

    【基礎(chǔ)算法】矩陣的幾種基本運(yùn)算 & C++實(shí)現(xiàn)

    ????????從線性代數(shù)中我們已知,兩個(gè)矩陣可以進(jìn)行加減乘運(yùn)算,但矩陣之間沒有除法運(yùn)算。(下面以3×3矩陣為例): ?????????矩陣的數(shù)乘運(yùn)算類屬與兩矩陣相乘的一種特殊形式(數(shù)乘矩陣的這個(gè)數(shù),我們可以將其化為對(duì)角線為該數(shù),其余位置都為0的矩陣,再用該對(duì)

    2024年02月11日
    瀏覽(23)
  • java的7種位運(yùn)算符

    1 概述 ? 在Java語(yǔ)言中,提供了7種位運(yùn)算符,分別是按位與()、按位或(|)、按位異或(^)、取反(~)、左移()、帶符號(hào)右移()和無(wú)符號(hào)右移()。 ? 這些運(yùn)算符當(dāng)中,僅有~是單目運(yùn)算符,其他運(yùn)算符均為雙目運(yùn)算符。 ? 對(duì)數(shù)值類型數(shù)據(jù)進(jìn)行按位操作;1表示true、0表示false。

    2024年02月09日
    瀏覽(10)
  • 記錄一下C#深拷貝的幾種方式

    記錄一下C#深拷貝的幾種方式

    一、C#中預(yù)定義數(shù)據(jù)類型 ? ? ? ? 1》值類型 ? ? ? ? ?2》引用類型 兩種類型的不同點(diǎn): ? ? ? ?概念: 值類型直接存儲(chǔ)其值,而引用類型存儲(chǔ)對(duì)值的引用 ? ? ? ?存儲(chǔ): 值類型存儲(chǔ)在堆棧 (stack) 上,而引用類型存儲(chǔ)在托管堆上(managed heap)。 當(dāng)使用值類型,進(jìn)行賦值的

    2023年04月08日
    瀏覽(47)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包