关于 二进制运算 的那些事

本文详细介绍了二进制、八进制、十进制和十六进制的基本概念及其相互转换方法,并探讨了计算机中RGB颜色模式的表示,以及如何通过代码进行进制转换,包括从RGB到整数的转换和反之。文中提供了具体的转换步骤和示例代码。
摘要由CSDN通过智能技术生成

aa本文主要讲解二进制数、八进制数、十进制数、十六进制数的概念,进制数之间的转换,以及如何实现代码转换rgb(具体内容大纲如下图)。有什么不足或不妥之处,还请多多指教!欢迎大家评论区补充!

一、什么是进制数? 

进位制/位置计数法是一种记数方式,故亦称进位记数法/位值计数法,可以用有限的数字符号代表所有的数值。可使用数字符号的数目称为基数(en:radix)或底数,基数为n,即可称n进位制,简称n进制。最常用的是十进制,通常使用10个阿拉伯数字0-9进行记数。

<1> 二进制数

1、在二进制数中,有0,1, 两个基本数字组成。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。在计算机中通常采用的就是二进制。

2、在编程语言(机器语言、汇编语言、高级语言)中,机器语言中的指令通常以二进制代码形式存储。

3、在生活中,十进制十分方便,但是在计算机中需要用电子管来表达十种状态较为复杂,因此计算机中通常只有两种状态:开和关。因此,电子管的状态决定了计算机以二进制的形式存储数字和数据。

二进制相同的还有八进制、十进制数、十六进制数。

<2> 八进制数

在八进制数中,有0,1,2,3, 4, 5, 6, 7, 八个基本数字组成。它的计数基数为8。低位数和高一位数之间的关系是逢八进一

<3> 十进制数

在十进制数中,有0,1,2,3, 4, 5, 6, 7, 8, 9,十个基本数字组成。它的计数基数为2。

<4> 十六进制数

在十六进制数中,有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。它的基数是16。其中A-F分别表示十进制数字10~15.十六进制数的进数规则是“逢十六进一”,它的各位的权是以16的N次方标识的。通常,对十六进制数的表示,可以在数字的右下角标注16或H。

(但在C语言中是在数的前面加数字0和字母X即0X来表示。例如,12AF在C语言中表示为0X12AF。)

二、 进制数之间的转换

在计算机科学中,二进制、八进制、十进制、十六进制有简写,这样是为了不混淆。十进制一般在末尾加个字母D(一般习惯都不加),二进制加个B,八进制加Q,十六进制加H。

用以前学习过的方法表示十进制向其他进制转换:

<1> 二进制数  转  八进制数 

采取“取三合一法”。从二进制的小数点为分界点向小数点的左边开始取三位二进制的数转换为一位八进制的数

(Tip:小数点左边的数不够三位的在数的最前面补零,小数点后面的不够三位则在数的后面补零) 

<2> 二进制数  转  十进制数

首先把二进制数写成加权系数展开式,然后按十进制加法规则求和。即"按权相加"法。具体如下图:

<3>  二进制数  转  十六进制数

从二进制的小数点为分界点,向左(或向右)每四位取成一位。即“取四合一法”。具体如下:

 

<4>  十进制数 转 二进制数

十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。

1、整数部分:"除2取余,逆序排列"法

具体做法:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来

2、小数部分:"乘2取整,顺序排列"法

具体做法:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。

具体如下图(23.2):

得出整数部分转化二进制为:10111

得出小数部分转化二进制为:0.0011······

从上面步骤可以看出,当小数部分做第五次做乘法时,得到的结果是0.4,那么小数部分继续乘以2,得0.8,0.8又乘以2的,到1.6这样一直乘下去,最后不可能得到小数部分为零,因此,这个时候只好学习十进制的方法进行四舍五入了,但是二进制只有0和1两个,于是就出现0舍1入。这个也是计算机在转换中会产生误差,但是由于保留位数很多,精度很高,所以可以忽略不计。

那么,我们可以得出结果将0.2转换为二进制约等于0.0011

所以,十进制数23.2转二进制数约为 10111.0011

<5> 十六进制数 转 二进制数

将十六进制数转换成二进制数时,只要将每一位十六进制数用四位相应的二进制数表示,即可完成转换。

 

三、如何用代码转换进制数(rgb)?

<1> 计算机中颜色的存储方式

 颜色模式,是将某种颜色表现为数字形式的模型,或者说是一种记录图像颜色的方式。分为:RGB模式、CMYK模式、HSB模式、Lab模式、位图模式、灰度模式、索引颜色模式、双色调模式和多通道模式。(这里主要介绍RGB模式)

1、RGB模式

RGB是最常用的彩色模式,使用于显示器、投影仪、扫描仪、数码相机等。,RGB分别代表红、绿、蓝三原色,RGB采用此模式每个像素占用3个字节(一个字节8位),分别用于表示颜色的R、G、B分量(255、255、255)。

当3种基色的亮度值相等时,产生灰色

当3种亮度值都是255时,产生纯白色

当所有亮度值都是0时,产生纯黑色

当3种色光混合生成的颜色一般比原来的颜色亮度值高,所以RGB模式产生颜色的方法又被称为色光加色法。

通常情况下,RGB各有256级亮度,用数字表示为从0、1、2至255。虽然数字最高是255,但0也是数值之一,因此共256级。按照计算,256 级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。通常也被简称为1600万色或千万色。也称为24位色(2 的24次方)。

2、关于颜色

常见的颜色有 8位16位 24位32位色,其中24位及以上称为真彩,是PC上最常用的颜色。

windows下的32位是R、G、B三个通道各占8位共24位,加上明度通道8位,所以是32位,24位也就是R、G、B三个通道各占6位共18位,加上明度通道6位,所以是24位。

24位是指图片颜色的位数,之所以图片要分颜色的位数,是因为图片以“像素”形式存贮着,要记录下来每一个“像素”的颜色值,这样才能在打开图片时看到存贮的图片

记录每一个像素的颜色值占用的二进制位数,就是BMP图片的位数,记录颜色值时又有不同的方法,比如用RGB值,也就是记录下红(RED)、绿(GREEN)、蓝(BLUE)的颜色值进行混合。

<2> int 存储

int(整数)在计算机中占4Byte, 共32位。最大正数是2**31 -1=2147483647, 最小负数为 -2**31=-2147483648。如下图,即为1个int 所占据的空间(其中RGB颜色存储为图中所对于颜色横线处)。

 <3> 利用移位转换进制数

int = 0000 0000 1010 1010 1010 1010 1010 1010

当我们需要取出红色值时,只需将二进制数向右移动16位,

即为 0000 0000 0000 0000 0000 0000 1010 1010,此时转化的数字即为正确的红色rgb值。

但是,当我们要取出绿色,蓝色值时,向右移动显然是不可行的。

拿蓝色举例,我们可以将整个值向左移动24位,再向右移动24位。

这时输出的rgb蓝色值我们发现是负的,原因是,int为整数型储存数值,是有正负之分,而int存储中的第一位代表的就是正负符号。

那么我们可以用>>>这个符号,即不带符号的右移。

<4> 利用 & 运算 转换

还有一种更简单的方法,那就是&运算(与 运算)

当我们对两个int值进行&运算时,相同部分保留1,不同部分则为0。我们看下面的例子:

 我们可以发现通过这种方法我们可以得到我们想要的蓝色值,想要得到绿色值,则可以把整个值(int)向左移8位,再进行&运算。

相关代码如下图:

public class BinTest {
	public static void main(String[] args){
		int rgb = 266330079;
		int red = (rgb>>16)&255;
		System.out.println(red);
		int green = (rgb>>8)&255;
		System.out.println(green);
		int blue = (rgb>>0)&255;
		System.out.println(blue);
		
		
	}
}

<5> rgb值 转 int

将rgb红色值左移16位,加上绿色值左移8位,加上蓝色值再输出int即可。相关代码如下:

public class BinTest {
	public static void main(String[] args){
		int red = 250;
		int red1 = red<<16;
		int green = 250;
		int green1 = green<<8;
		int blue = 250;
		int blue1 = blue;
		int rgb = (red1+green1+blue1);
		System.out.println(rgb);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值