为了账号安全,请及时绑定邮箱和手机立即绑定

如何才能看懂别人写的位运算代码?

如何才能看懂别人写的位运算代码?

杨魅力 2019-04-17 18:15:53
 import java.awt.Color; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.PixelGrabber; /**  * 我知道位运算是什么,怎么运算的,但我实在看不懂别人写的位运算代码,求高人指点我如何才能看懂别人写的位运算代码?  *   * 希望能得到详细的回答,除了将这个类的所有位运算都解释一遍,还请将位运算在java图像处理中有哪些应用告诉我,谢谢!  */ public class DyedImageUtils {     /**      * 根据指定颜色过滤像素      *       * @param pixel      * @param filterColor      * @return      */     private static int filter(int pixel, Color filterColor) {         int alpha = pixel >> 24 & 0xff;// 为什么要将pixel进行">> 24"呢,又为什么要"& 0xff"呢,能解释解释这句代码的意义吗?         if (alpha > 0) {             pixel = gray(pixel);             return pixel & filterColor.getRGB();// 同上,这句"按位与"的代码我也不明白为什么要这么做         } else {             return 0;         }     }     /**      * 处理颜色灰度      *       * @param rgb      * @return      */     private static int gray(int rgb) {         int a = rgb & 0xff000000;// 同上,这句"按位与"的代码我也不明白为什么要这么做         int r = rgb >> 16 & 0xff;// 同上,不明白为什么要这么做         int g = rgb >> 8 & 0xff;// 同上         int b = rgb & 0xff;// 同上         rgb = r * 77 + g * 151 + b * 28 >> 8;// 同上         return a | rgb << 16 | rgb << 8 | rgb;// 同上     }     /**      * 对图片进行着色      *       * @param image      * @param color      * @return      */     public static Image createDyedImage(Image image, Color color) {         if (color == null) {             return image;         } else {             if (image != null) {                 int w = image.getWidth(null);                 int h = image.getHeight(null);                 int[] pixels = new int[w * h];                 PixelGrabber pg = new PixelGrabber(image, 0, 0, w, h, pixels, 0, w);                 try {                     pg.grabPixels();                 } catch (InterruptedException ex) {                     ex.printStackTrace();                     return null;                 }                 BufferedImage bi = new BufferedImage(w > 1 ? w : 1, h > 1 ? h : 1, BufferedImage.TYPE_INT_ARGB);                 for (int i = 0; i < pixels.length; i++) {                     int pixel = pixels[i];
查看完整描述

4 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

你要理解RGB的2进制格式,R,G,B的取值范围是0-255,如果是ARGB,前面还有一个透明度0-255。255在2进制中占8位,也就是
ARGB像素格式(左边最高位,右边最低位):00000000RRRRRRRRGGGGGGGGBBBBBBBB。
到这个格式你那位移就清楚了,取A得值,只要后面24位都置成0,前8位为1,做与就行了。当然你要>>24&0xff也可以,只是没必要。>>24后,再最后处理完灰度后还得<<24回来。
取R,G,B都一样原理。

查看完整回答
反对 回复 2019-05-07
?
三国纷争

TA贡献1804条经验 获得超7个赞

很容易理解,>>24就是取一个整数二进制的25~32位。它代表alpha(透明度)通道。
&0xff就是将这个整数的高位全部置为0,只保留它的低位。
比如
int rgb = 1110 0001 1011 0000 1100 0010 0010 0000 (这样写是不合法的,但是为了让你看清,我写成二进制形式)
a = rgb >> 24 就是往右边移24位,因为最高位是1,所以移动后最高位会填充1。
此时a = 1111 1111 1111 1111 1111 1111 1110 0001 
然后&0xff就是按位and 0000 0000 0000 0000 0000 0000 1111 1111
结果就是 0000 0000 0000 0000 0000 0000 1110 0001
也就是1110 0001,可见将rgb的最高8位取了出来。
以此类推。

查看完整回答
反对 回复 2019-05-07
?
手掌心

TA贡献1942条经验 获得超3个赞

如果是基本的看懂得话,记着关键字,等结合它本身的意思,把变量带入就可以了。看代码时在头脑里一步一步的“执行”下去!其实就像读课文以样,都有固定的模式,多读几遍也就熟了


查看完整回答
反对 回复 2019-05-07
  • 4 回答
  • 0 关注
  • 530 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信